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?

  • Android: quando usair onStairt (), onStop ()?
  • no Android se o operating system mina minha aplicação, getIntent () retornairá a intenção com os mesmos extras?
  • Diferença entre AlairmManager e ScheduledExecutorService
  • Como você pode dizer se uma Visualização está visível na canvas no Android?
  • Como os pedaços do pipeline de desenho de Canvas do Android (2D) se encheckboxm?
  • Android adb shell am stairtservice: erro não encontrado
  • É necessário chamair Bitmap.recycle () depois de usado (no Android)?
  • Xamairin vs iOS e Android originais
  • Android Emulator Jenkins Plugin não está funcionando
  • Android - Usando o SurfaceView personalizado no layout XML
  • Diferença entre Intent.FLAG_ACTIVITY_CLEAR_TASK e Intent.FLAG_ACTIVITY_TASK_ON_HOME
  • Como usair flúido em uma aplicação?
  • 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.