2015-05-09 18 views
7

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?

+0

il codice non funziona o vogliono solo per migliorarlo? –

+0

@NikMyers Voglio sapere se il mio approccio attuale è corretto. E se non lo è, qual è l'approccio giusto? – Vikram

+1

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

risposta

1

vorrei andare per la soluzione semplice, che si estende il layout e creare un layout personalizzato che invia attribuisce ad esso è bambini while adding them

+0

Ti sei collegato a 'addViewInLayout (Visualizza child, int index, parametri di LayoutParams, boolean prevenireRequestLayout)'. Come dovrei usare questo per leggere gli stili attrs per 'Child'? – Vikram

+0

sovrascrivendo questo metodo si avrà accesso a ciascun figlio aggiunto in modo da poter inserire gli attrs desiderati a livello di programmazione –

+0

Scusa, ma non sto cercando alternative. In conformità con le linee guida di Android, le informazioni di stile devono essere impostate utilizzando gli attributi. Altrimenti, non c'è alcuno scopo per gli stili, attrs ecc. Poiché tutto può essere fatto sul lato Java. – Vikram