¿Cómo uso obtainStyledAttributes (int []) con temas internos de Android
-
22-09-2019 - |
Pregunta
Así que he mirado alrededor y descubrió que android.R.styleable
ya no es parte del SDK a pesar de que todavía se documenta aquí .
Eso no es realmente un problema si se documentó con claridad cuál es la alternativa. Por ejemplo, la aplicación Calendario AOSP sigue utilizando el 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();
Entonces, ¿cómo podría uno obtener la backgroundDimAmount
sin obtener el int[]
de android.R.styleable.Theme
?
¿Qué tengo que palo en obtainStyledAttributes(int [])
con el fin de hacer que funcione con el SDK?
Solución
La demo muestra API CustomView cómo recuperar los atributos de estilo. El código para la vista está aquí:
La matriz styleable utiliza para recuperar el texto, color, y el tamaño se define en la sección <declare-styleable>
aquí:
Puede utilizar <declare-styleable>
para definir cualquier lista de atributos que se desea recuperar como un grupo, que contiene tanto a sus propios y los definidos por la plataforma.
En cuanto a estas cosas estando en la documentación, hay un montón de java doc alrededor de las matrices styleable que los hace útiles para tener en la documentación, por lo que se han quedado allí. Sin embargo, como las matrices de cambio, como nuevos atributos que se agregan, los valores de las constantes pueden cambiar, entonces la plataforma no pueden estar en el SDK (y por favor, no use ningún tipo de trucos para tratar de acceder a ellos). No debería haber ninguna necesidad de utilizar las plataformas de todos modos, porque son cada uno no sólo para la ejecución de partes del marco, y es trivial para crear su propio como se muestra.
Otros consejos
En el ejemplo, se deja fuera la referencia al 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;
}
Cambiar obtainStyledAttributes a c.obtainStyledAttributes debe trabajar
Ejemplo de sacar atributo estándar (fondo) en una vista personalizada que tiene su propio estilo por defecto. En este ejemplo la vista personalizada PasswordGrid extiende GridLayout . Que se especifica un estilo para PasswordGrid que fija una imagen de fondo con el atributo estándar de Android Android:. Fondo
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();
}
}
}
Aquí es parte de mi archivo 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>
Esto parece ser un error en el SDK. He presentado una tema en él, que es posible que desee a la estrella con el fin de recibir actualizaciones sobre el mismo.
Como worksaround, se puede utilizar la reflexión para el acceso al campo:
Class clazz=Class.forName("android.R$styleable");
int i=clazz.getField("Theme_backgroundDimAmount").getInt(clazz);