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.

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.

  • Clase abstracta como parcelable
  • Método Android con prioridad (paquete) visibilidad sobreestablecimiento (no debería funcionar, pero sí, ¿por qué?)
  • Android: extiende Linearlayout, pero necesita lo mismo para RelativeLayout. Código duplicado inevitable?
  • ¿Cómo extender la clase android que implementa la interfaz Parcelable?
  • Herencia entre actividades en Android
  • LibGdx y Gwt: No hay código fuente disponible para el tipo
  • Parcelable y herencia en Android
  • Ampliación de la clase de Android View para agregar un dropshadow
  • 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.