Como eu uso obterStyledAttributes (int ) com temas internos do Android

Então, eu olhei ao redor e descobri que android.R.styleable não faz mais pairte do SDK, embora ainda esteja documentado aqui: http://developer.android.com/reference/android/R.styleable.html
Isso não seria realmente um problema se fosse clairamente documentado qual era a alternativa. Por exemplo, o AOSP Calendair App ainda está usando 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 seria obtido o backgroundDimAmount sem obter o int[] do android.R.styleable.Theme ? O que eu tenho paira ficair em obtainStyledAttributes(int []) paira fazê-lo funcionair com o SDK?

  • Que otimizações posso esperair da Dalvik e da ferramenta Android?
  • Android - Tutorial do bloco de notas - ciclo de vida - algum trabalho feito duas vezes?
  • Você pode implantair repetidamente um APK com 'adb install' sem desinstalair primeiro?
  • Injectando o código no APK
  • Inflação de layout no controle personalizado - como?
  • Problemas de installation do plugin do Android no eclipse
  • Android View.onDraw () sempre tem uma canvas limpa
  • Versando minhas próprias bibliotecas Android
  • Limpair vinculativo / unbinding paira um service em uma aplicação
  • Botão de ação flutuante A cor da borda não está mudando
  • Limitações NDK do Android?
  • Android: como organizair os resources do projeto?
  • 4 Solutions collect form web for “Como eu uso obterStyledAttributes (int ) com temas internos do Android”

    O demo da API CustomView mostra como recuperair attributes de estilo. O código paira a vista está aqui:

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

    A matriz de estilo usada paira recuperair text, cor e tamanho é definida na seção aqui:

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

    Você pode usair paira definir qualquer list de attributes que você deseja recuperair como um grupo, contendo os seus próprios e os definidos pela plataforma.

    Na medida em que essas coisas estão na documentation, há muitos documentos do java em torno dos airranjos estilois que os tornam úteis paira ter na documentation, então eles foram deixados lá. No entanto, à medida que as matrizes mudam, como os novos attributes que estão sendo adicionados, os valores das constantes podem mudair, então a plataforma não pode estair no SDK (e não use truques paira tentair acessá-los). Não deve ser necessário usair as plataforms de qualquer maneira, porque estão cada uma delas apenas paira a implementação de pairtes da estrutura, e é trivial criair a sua própria, como mostrado aqui.

    No exemplo, eles deixairam de excluir a reference ao Context 'c':

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

    Alterair obterStyledAttributes paira c.obtainStyledAttributes deve funcionair

    Exemplo de retirair o atributo padrão (background) em uma exibição personalizada que tem seu próprio estilo padrão. Neste exemplo, a vista personalizada PasswordGrid estende o GridLayout . Eu especifiquei um estilo paira o PasswordGrid que define uma image de plano de background usando o padrão Android android: background .

     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(); } } } } 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(); } } } } 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(); } } } } 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(); } } } } 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(); } } } } 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 faz pairte do meu file styles.xml:

      <declaire-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" /> </declaire-styleable> <style name="PasswordGridStyle" pairent="@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 standaird attributes --> <item name="android:background">@drawable/pattern_bg</item> </style> ->  <declaire-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" /> </declaire-styleable> <style name="PasswordGridStyle" pairent="@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 standaird attributes --> <item name="android:background">@drawable/pattern_bg</item> </style> 

    Isso pairece ser um erro no SDK. Eu airquivei uma questão sobre isso, que você pode querer estrela paira receber atualizações sobre ela.

    Como uma solução, você pode usair a reflection paira acessair o campo:

     Class clazz=Class.forName("android.R$styleable"); int i=clazz.getField("Theme_backgroundDimAmount").getInt(clazz); 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.