Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android: cómo obtener un atributo de una superclase de una vista personalizada

Tengo una vista personalizada A que tiene un TextView. I Hecho un método que devuelve el resourceID para TextView. Si no se define ningún texto, el método devuelve -1 por defecto. También tengo una vista personalizada B que hereda de la vista. Mi vista personalizada tiene el texto "hola". Cuando llamo al método para obtener el atributo de la clase super, obtengo -1 en su lugar.

En el código también hay un ejemplo de cómo soy capaz de recuperar el valor, pero se siente un poco de hacky.

  • Detenga OnLongClickListener disparando mientras arrastra
  • Attrs.xml

     <declare-styleable name="A"> <attr name="mainText" format="reference" /> </declare-styleable> <declare-styleable name="B" parent="A"> <attr name="subText" format="reference" /> </declare-styleable> 

    Clase a

     protected static final int UNDEFINED = -1; protected void init(Context context, AttributeSet attrs, int defStyle) { TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.A, defStyle, 0); int mainTextId = getMainTextId(a); a.recycle(); if (mainTextId != UNDEFINED) { setMainText(mainTextId); } } protected int getMainTextId(TypedArray a) { return a.getResourceId(R.styleable.A_mainText, UNDEFINED); } 

    Clase B

     protected void init(Context context, AttributeSet attrs, int defStyle) { super.init(context, attrs, defStyle); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.B, defStyle, 0); int mainTextId = getMainTextId(a); // this returns -1 (UNDEFINED) //this will return the value but feels kind of hacky //TypedArray b = context.obtainStyledAttributes(attrs, R.styleable.A, defStyle, 0); //int mainTextId = getMainTextId(b); int subTextId = getSubTextId(a); a.recycle(); if (subTextId != UNDEFINED) { setSubText(subTextId); } } 

    Otra solución que he encontrado hasta ahora es hacer lo siguiente. También creo que esto es una especie de hacky.

     <attr name="mainText" format="reference" /> <declare-styleable name="A"> <attr name="mainText" /> </declare-styleable> <declare-styleable name="B" parent="A"> <attr name="mainText" /> <attr name="subText" format="reference" /> </declare-styleable> 

    Cómo obtener un atributo de una superclase de una vista personalizada? Parece que no puedo encontrar buenos ejemplos sobre cómo funciona la herencia con vistas personalizadas.

  • Definición de attrs personalizados
  • Detenga OnLongClickListener disparando mientras arrastra
  • Android.view.InflateException al usar selectableItemBackground
  • No se puede resolver el atributo desde el espacio de nombres android
  • Usar la etiqueta <include> con? Attr / myAttr
  • ¿Cómo referenciar los atributos de estilo de un drawable?
  • One Solution collect form web for “Android: cómo obtener un atributo de una superclase de una vista personalizada”

    Aparentemente esta es la manera correcta de hacerlo:

     protected void init(Context context, AttributeSet attrs, int defStyle) { super.init(context, attrs, defStyle); TypedArray b = context.obtainStyledAttributes(attrs, R.styleable.B, defStyle, 0); int subTextId = getSubTextId(b); b.recycle(); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.A, defStyle, 0); int mainTextId = getMainTextId(a); a.recycle(); if (subTextId != UNDEFINED) { setSubText(subTextId); } } 

    Hay un ejemplo en el origen de TextView.java. En la línea 1098

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.