Así que he mirado por ahí y se encontró que android.R.styleable ya no forma parte de la SDK aunque todavía está documentado aquí.

Que no sería un problema si es que fue documentado claramente lo que la alternativa es. Por ejemplo, el AOSP Aplicación de Calendario todavía está utilizando la 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 se obtiene el backgroundDimAmount sin llegar a la int[] de android.R.styleable.Theme?

¿Qué tengo que palo en obtainStyledAttributes(int []) con el fin de hacer que es trabajar con el SDK?

  • El mismo problema existe con la Vista de la Galería tutorial, he visto soluciones que hacen el trabajo tutorial pero no hay explicación de cómo el tutorial tendría que ser corregido utilizando sólo SDK de clases y no la adición de su propio xml con la styleable en ella. El tutorial está en developer.android.com/resources/tutorials/views/… el código es en el «ImageAdapter(Contexto c)» Constructor
  • Aquí es un debate similar stackoverflow.com/q/8793183/1307690
InformationsquelleAutor AGrunewald | 2010-01-24

4 Comentarios

  1. 13

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

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

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

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

    Puede utilizar <declare-styleable> para definir la lista de atributos que desea recuperar como un grupo, que contiene tanto los propios como los definidos por la plataforma.

    Para estas cosas está en la documentación, hay un montón de java doc alrededor de la styleable las matrices que los hace útiles para tener en la documentación, por lo que se han quedado allí. Sin embargo, como las matrices de cambio, tales como los nuevos atributos que se agrega, los valores de las constantes pueden cambiar, por lo que la plataforma no pueden estar en el SDK (y por favor, no utilice trucos para intentar acceder a ellos). No debería haber ninguna necesidad de utilizar la plataforma queridos de todos modos, porque cada uno de ellos está ahí sólo para la ejecución de partes de la estructura, y es trivial para crear tu propia como se muestra aquí.

    • Gracias por la info,ayuda bastante.Como tengo entendido que uno crea, el Xml Styleable con, por ejemplo. un atributo «android:backgroundDimAmount» que permite a la Aplicación para recuperar los Datos correctos. Con respecto a las cosas que están en el SDK. Yo entiendo que hay una gran cantidad de valiosa Documentación, sino una explicación de por qué la Clase se encuentra en el SDK de doc y no en el SDK de derecho en la Referencia de la API podría aclarar las cosas para los Desarrolladores en el futuro, ya que todavía hay tutoriales que lo hacen mal: developer.android.com/intl/zh-CN/resources/tutorials/views/…
    • Primer enlace en la respuesta es obsoleta.
  2. 15

    En el ejemplo, dejaron fuera de la referencia al Contexto de ‘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

    • Sé que esto llega tarde, pero esta es la respuesta correcta!!!
    • Esto me ayudó demasiado. Fácil y rápido resultado. gracias @kpasgma.
  3. 7

    Ejemplo de sacar atributo estándar (de fondo) en una vista personalizada que tiene su propio estilo por defecto. En este ejemplo, la vista personalizada PasswordGrid se extiende GridLayout. Yo especifica un estilo de PasswordGrid que establece una imagen de fondo usando el estándar de android atributo 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();
                }
            }
        }

    Aquí es parte de mi styles.xml archivo:

     <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>
  4. 4

    Esto parece ser un error en el SDK. He presentado una problema en él, que es posible que desee estrellas, así como para recibir actualizaciones sobre ella.

    Como un worksaround, puede utilizar la reflexión para tener acceso al campo:

    Class clazz=Class.forName("android.R$styleable");
    int i=clazz.getField("Theme_backgroundDimAmount").getInt(clazz);
    • Bueno, según Dianne Hackborn se extrae intencionalmente el SDK por ocultarlo. Aquí la Discusión sobre el mismo groups.google.com/group/android-developers/tree/browse_frm/… por Lo que hay una manera de hacerlo correctamente sin el uso de la reflexión?
    • Si es que intencionalmente se ha ido, usted no debería usar. Aplicaciones internas (por ejemplo, Calendario) puede usar, porque no se limita a usar el SDK. Más allá de eso, no tengo ningún consejo, lo siento. He actualizado el tema para tratar de obtener algunas respuestas.
    • Gracias, ya me acuerdo, yo no debería estar usando la misma pero, a continuación, debe haber una alternativa. Y la Vista de la Galería Tutorial debería haber sido actualizado desde hace mucho tiempo, ya que aún es muestra de que el código.

Dejar respuesta

Please enter your comment!
Please enter your name here