Obtener atributos con estilo para el niño de la definición de estilo de los padres

El título de la pregunta es probablemente absurdo. Estoy creando un montón de vistas personalizadas que se colocarán en un solo diseño padre – un FrameLayout personalizado.

Estas vistas personalizadas tienen su propio estilo attr que se establecen usando el attr del estilo de los padres.

Como ejemplo, considere Parent como el FrameLayout personalizado. Su estilo attr se define en attrs.xml :

 <attr name="parentStyleAttr" format="reference" /> 

El Child también tiene su attr:

 <attr name="childStyleAttr" format="reference" /> 

Y Parent define su estilo como attr:

 <declare-styleable name="Parent"> <attr name="childStyleAttr" /> </declare-styleable> 

Estilo Child's attr:

 <declare-styleable name="Child"> <attr name="childBgColor" format="color" /> </declare-styleable> 

Después de esto, defino un estilo para el padre:

 <style name="ParentStyle"> <item name="childStyleAttr">@style/ChildStyle</item> </style> 

Y uno para el Child :

 <style name="ChildStyle"> <item name="childBgColor">@color/blah</item> </style> 

Para Parent , configuré parentStyleAttr en el tema de la aplicación:

 <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="parentStyleAttr">@style/ParentStyle</item> </style> 

Ahora, cuando Parent se crea, infla un diseño que contiene Child :

 LayoutInflater.from(getContext()).inflate(R.layout.child, this, true); 

Durante Child's inicialización Child's , necesito leer el valor del atributo de estilo establecido en @style/ChildStylechildBgColor .

Esto no funciona:

 final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.Child, R.attr.childStyleAttr, R.style.ChildStyle); 

La forma en que estoy leyendo attr/childBgColor es:

 public Child(Context context, AttributeSet attrs, int defStyleAttr) { super(createThemeWrapper(context), attrs, defStyleAttr); initialize(attrs, defStyleAttr, R.style.ChildStyle); } private static ContextThemeWrapper createThemeWrapper(Context context) { final TypedArray forParent = context.obtainStyledAttributes( new int[]{ R.attr.parentStyleAttr }); int parentStyle = forParent.getResourceId(0, R.style.ParentStyle); forParent.recycle(); TypedArray forChild = context.obtainStyledAttributes(parentStyle, new int[]{ R.attr.childStyleAttr }); int childStyleId = forChild.getResourceId(0, R.style.ChildStyle); forChild.recycle(); return new ContextThemeWrapper(context, childStyleId); } void initialize(AttributeSet attrs, int defStyleAttr, int defStyleRes) { Context context = getContext(); final Resources res = getResources(); final TypedArray a = context.obtainStyledAttributes(R.styleable.Child); .... } 

No estoy seguro si este es el enfoque correcto. ¿Puede alguien ayudar a arrojar algo de luz sobre esto?

One Solution collect form web for “Obtener atributos con estilo para el niño de la definición de estilo de los padres”

Me gustaría ir a la solución simple que ampliar el diseño y crear un diseño personalizado que envía atributos a sus hijos, mientras que la adición

  • cómo poner texto bajo vista de imagen
  • Permisos de usuario de Android para acceder a Internet
  • Error de Android Studio XML
  • Las etiquetas HTML no funcionan dentro de strings.xml
  • Android: cambiar el tamaño de la vista de la imagen en XML
  • XmlPullParser getAttributeValue devuelve null
  • ¿Por qué el título no está centrado en la barra de herramientas?
  • Cómo crear un proyecto de biblioteca de android en android?
  • No se puede reanudar la actividad
  • Cómo crear una tabla en Android con varias columnas?
  • Mi proyecto de Android ha duplicado las declaraciones entre Enum y string.xml
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.