Pergunta

Então eu olhei em volta e descobri que android.R.styleable não faz mais parte do SDK, embora ainda esteja documentado aqui.

Isso não seria realmente um problema se fosse claramente documentado qual é a alternativa.Por exemplo, o aplicativo de calendário AOSP ainda usa o android.R.styleable

// Get the dim amount from the theme   
TypedArray a = obtainStyledAttributes(com.android.internal.R.styleable.Theme);
lp.dimAmount = a.getFloat(android.R.styleable.Theme_backgroundDimAmount, 0.5f);
a.recycle();

Então, como alguém conseguiria o backgroundDimAmount sem conseguir o int[] de android.R.styleable.Theme?

No que eu tenho que me apegar obtainStyledAttributes(int []) para fazê-lo funcionar com o SDK?

Foi útil?

Solução

A demonstração da API CustomView mostra como recuperar atributos estilizados.O código da visualização está aqui:

https://github.com/android/platform_development/blob/master/samples/ApiDemos/src/com/example/android/apis/view/LabelView.java

A matriz estilizável usada para recuperar o texto, a cor e o tamanho é definida no arquivo <declare-styleable> seção aqui:

https://github.com/android/platform_development/blob/master/samples/ApiDemos/res/values/attrs.xml#L24

Você pode usar <declare-styleable> para definir qualquer lista de atributos que você deseja recuperar como um grupo, contendo os seus próprios e os definidos pela plataforma.

No que diz respeito a essas coisas estarem na documentação, há muitos documentos Java em torno dos arrays estilizados que os tornam úteis na documentação, então eles foram deixados lá.Porém conforme os arrays mudam, como novos atributos sendo adicionados, os valores das constantes podem mudar, então os da plataforma não podem estar no SDK (e por favor não use nenhum truque para tentar acessá-los).De qualquer forma, não deve haver necessidade de usar os de plataforma, porque cada um deles existe apenas para a implementação de partes do framework, e é trivial criar o seu próprio, conforme mostrado aqui.

Outras dicas

No exemplo, eles deixaram de fora a referência ao contexto 'C':

public ImageAdapter(Context c) {
    TypedArray a = c.obtainStyledAttributes(R.styleable.GalleryPrototype);
    mGalleryItemBackground = a.getResourceId(
            R.styleable.GalleryPrototype_android_galleryItemBackground, 0);
    a.recycle();
    return mGalleryItemBackground;
}

Alterar o obtenção de obtidas para o c.BtanStyledAttributes deve funcionar

Exemplo de retirar o atributo padrão (plano de fundo) em uma visualização personalizada que possui seu próprio estilo padrão. Neste exemplo, a visualização personalizada PasswordGrid estende -se Gridlayout. Especifiquei um estilo para senha -grid que define uma imagem de fundo usando o atributo Android padrão Android: fundo.

public class PasswordGrid extends GridLayout {

    public PasswordGrid(Context context) {
        super(context);
        init(context, null, 0);
    }

    public PasswordGrid(Context context, AttributeSet attrs) {
        super(context, attrs, R.attr.passwordGridStyle);
        init(context, attrs, 0);
    }

    public PasswordGrid(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context, attrs, defStyle);
    }

    private void init(Context context, AttributeSet attrs, int defStyle) {
        if (!isInEditMode()) {

            TypedArray stdAttrs = context.obtainStyledAttributes(attrs,
                    new int[] { android.R.attr.background },  // attribute[s] to access
                    defStyle, 
                    R.style.PasswordGridStyle);  // Style to access

           // or use any style available in the android.R.style file, such as
           //       android.R.style.Theme_Holo_Light

            if (stdAttrs != null) {
                Drawable bgDrawable = stdAttrs.getDrawable(0);
                if (bgDrawable != null)
                    this.setBackground(bgDrawable);
                stdAttrs.recycle();
            }
        }
    }

Aqui está parte do meu arquivo styles.xml:

 <declare-styleable name="passwordGrid">
    <attr name="drawOn" format="color|reference" />
    <attr name="drawOff" format="color|reference" />
    <attr name="pathWidth" format="integer" />
    <attr name="pathAlpha" format="integer" />
    <attr name="pathColor" format="color" />
 </declare-styleable>



  <style name="PasswordGridStyle" parent="@android:style/Widget.GridView" >  
      <!--  Style custom attributes.  -->
      <item name="drawOff">@drawable/ic_more</item>
      <item name="drawOn">@drawable/ic_menu_cut</item>
      <item name="pathWidth">31</item>
      <item name="pathAlpha">129</item>
      <item name="pathColor">@color/green</item>

      <!-- Style standard attributes -->
      <item name="android:background">@drawable/pattern_bg</item>
</style>

Isso parece ser um bug no SDK. Eu arquivei um questão nele, que você deseja estrelar para receber atualizações sobre ele.

Como solução de trabalho, você pode usar a reflexão para acessar o campo:

Class clazz=Class.forName("android.R$styleable");
int i=clazz.getField("Theme_backgroundDimAmount").getInt(clazz);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top