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

  • Permitir que EditText se desplace mientras está deshabilitado
  • Android: IME sin teclado
  • Alinea el texto dentro de un botón en Android
  • AutoCompleteTextView setError
  • Android Lollipop Diseño del material Desbordamiento Menú Icon color
  • Android: establece una vista para estar encima de los elementos dibujados con lienzo
  • CoordinatorLayout con RecyclerView & CollapsingToolbarLayout
  • La imagen no aparece en HTC One M8
  • Cómo detener a Eclipse de intentar ejecutar archivos XML?
  • ImageView no se extiende (Android)?
  • Android XML dibujable degradado transparente
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.