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?

¿Fue útil?

Solución

La demo muestra API CustomView cómo recuperar los atributos de estilo. El código para la vista está aquí:

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

La matriz styleable utiliza para recuperar el texto, color, y el tamaño se define en la sección <declare-styleable> aquí:

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

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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top