Il titolo della domanda è probabilmente privo di senso. Sto creando un sacco di viste personalizzate che verranno posizionate in un unico layout principale: una personalizzata FrameLayout
.Ottieni attributi di stile per bambino dalla definizione di stile del genitore
Queste viste personalizzate hanno il proprio stile attr che viene impostato utilizzando lo stile del padre attr.
Ad esempio, considerare Parent
come personalizzato FrameLayout
. Il suo stile attr
è definito in attrs.xml
:
<attr name="parentStyleAttr" format="reference" />
Il Child
ha anche la sua attr:
<attr name="childStyleAttr" format="reference" />
E Parent
definisce il suo styleable attr come:
<declare-styleable name="Parent">
<attr name="childStyleAttr" />
</declare-styleable>
Child's
attr styleable:
<declare-styleable name="Child">
<attr name="childBgColor" format="color" />
</declare-styleable>
A seguito di questo, mi definisco uno stile per il genitore:
<style name="ParentStyle">
<item name="childStyleAttr">@style/ChildStyle</item>
</style>
e uno per Child
:
<style name="ChildStyle">
<item name="childBgColor">@color/blah</item>
</style>
Per Parent
, ho istituito parentStyleAttr
nel tema della app:
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="parentStyleAttr">@style/ParentStyle</item>
</style>
Ora, quando viene creato Parent
, si gonfia s un layout contenente Child
:
LayoutInflater.from(getContext()).inflate(R.layout.child, this, true);
Durante Child's
l'inizializzazione, ho bisogno di leggere il valore dell'attributo stile impostato in @style/ChildStyle
- childBgColor
.
Questo non funziona:
final TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.Child, R.attr.childStyleAttr, R.style.ChildStyle);
Il modo Attualmente sto leggendo attr/childBgColor
è:
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);
....
}
io non sono sicuro se questo è l'approccio giusto. Qualcuno può aiutare a far luce su questo?
il codice non funziona o vogliono solo per migliorarlo? –
@NikMyers Voglio sapere se il mio approccio attuale è corretto. E se non lo è, qual è l'approccio giusto? – Vikram
Potrei sbagliarmi, ma il problema che stai descrivendo è simile all'ereditarietà del tema principale che è stata implementata nel recente aggiornamento 'appcompat': https://chris.banes.me/2015/04/22/support-libraries -v22-1-0/# androidtheme L'autore ha menzionato 'LayoutInflater.Factory2' come la classe che abilita l'ereditarietà del tema principale. – hidro