2011-09-19 11 views
13

Sto riscontrando qualche problema che fondamentalmente non so come risolvere. Ho un LinearLayout con alcune compenents bambino in esso, come ImageView, TextView e così via, un esempio può essere visto nel xml di seguito:Android: propagazione dello stato genitore in visualizzazione figlio

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="horizontal" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
style="@style/list_buttom_top"> 

<LinearLayout android:gravity="center_vertical" 
    android:paddingLeft="10dip" 
    android:orientation="vertical" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_weight="1.0"> 

    <TextView android:text="title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/title" 
     style="@style/content_page_large_text" /> 

    <TextView android:text="summary" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/subtitle" 
     android:visibility="visible" 
     style="@style/content_page_small_text" /> 
</LinearLayout> 

<TextView android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/itemCount" 
    android:visibility="gone" 
    style="@style/content_page_large_count_text" /> 

<ImageView android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/chevron" 
    style="@style/list_buttom_chevron" /> 

</LinearLayout> 

Il list_buttom_top stile dice che quando il LinearLayout si trova nello stato premuto, il colore di sfondo deve essere cambiato, e finora questo sta funzionando. Il problema è che content_page_large_text dice anche che il colore del testo del TextView deve essere cambiato, ma non succede. L'unico cambiamento di colore quando clicco su LinearLayout è il suo sfondo.

<style name="list_buttom_top"> 
<item name="android:clickable">true</item> 
<item name="android:paddingTop">10dip</item> 
<item name="android:paddingBottom">10dip</item> 
<item name="android:paddingLeft">10dip</item> 
<item name="android:paddingRight">10dip</item> 
<item name="android:gravity">center_vertical</item> 
<item name="android:background">@drawable/background_view_rounded_top</item> 
</style> 

<style name="list_buttom_chevron"> 
    <item name="android:paddingLeft">4.0dip</item> 
    <item name="android:paddingTop">2.0dip</item> 
    <item name="android:paddingRight">4.0dip</item> 
    <item name="android:paddingBottom">2.0dip</item> 
    <item name="android:layout_width">wrap_content</item> 
    <item name="android:layout_height">wrap_content</item> 
    <item name="android:src">@drawable/chevron</item> 
</style>  

Ho provato con questo androide: duplicateParentState = "true" nelle mie TextViews ma lavoro anche di poco. Lo stesso accade per ImageView, che non ottiene la sua immagine di origine cambiata quando clicco su LinearLayout.

Mi manca qualcosa qui? Grazie per l'attenzione T

risposta

0

Sarebbe un problema più facile da tracciare se potessimo vedere il tuo stile content_page_large_text. Inoltre, non vedo come si sta effettivamente impostando il colore, è il tuo background_view_rounded_top un elemento <selector> o lo stai impostando in un listener nell'attività?

Ma sì, ho anche scoperto di recente che Android: duplicateParentState = "true" non è la panacea che pensavo fosse.

Nel caso in cui queste due soluzioni fossero esaurite, la soluzione go-to in genere è un componente personalizzato per il layout radice. http://developer.android.com/guide/topics/ui/custom-components.html Ma questo potrebbe non essere necessario se l'interfaccia è così semplice. Sono abbastanza sicuro che puoi farlo con StateListDrawable s.

I componenti personalizzati sono in genere più semplici del tentativo di trovare la combinazione magica di variabili xml e renderanno il layout più comprensibile/modificabile in un secondo momento se si prevede di renderlo più complicato.

33

Penso che dovresti impostare android:addStatesFromChildren="true" nel layout lineare, in questo modo lo stato dei bambini viene propagato al genitore.

Inoltre, assicurarsi che NON combinare questo con android:duplicateParentState="true" poiché causerà un'eccezione di overflow dello stack (causando fondamentalmente un ciclo di riferimento infinito).

+5

Anche se non risponde completamente alla domanda, 'android: duplicateParentState =" true "' era esattamente quello che stavo cercando. – PureSpider

+0

grazie a @SMR per la modifica ... –

+0

Ha chiesto come propagare gli stati dal genitore al figlio. Non il contrario. –

Problemi correlati