2012-12-04 11 views
11

Ho un tema chiamato "greenhighlight" — questo tema è stata generata utilizzando il Android Action Bar Style Generator, ed eredita dal tema predefinito ActionBarSherlock. Il tema non fa altro che modificare l'evidenziazione nella parte inferiore di ActionBar da blu a verde.Quali attributi del tema devo sovrascrivere per modificare il colore di evidenziazione blu delle mie finestre di dialogo?

Per tema tutte le mie attività, solo che:

<application android:theme="@style/Theme.greenhighlight"... 

Questo funziona abbastanza bene per le attività (si noti il ​​punto culminante verde sul fondo del ActionBar):

themed Android activity

Tuttavia , Ho difficoltà a definire le mie finestre di dialogo per abbinare le mie attività:

default theme Android list dialog

default theme Android progress dialog

Il mio tema "greenhighlight_Dialog" è definito come:

<style name="greenhighlight_Dialog" parent="@style/Theme.Sherlock.Dialog"> 
    <item name="android:progressBarStyleHorizontal"> 
     @style/greenhighlight_ProgressBar 
    </item> 
</style> 

sto ereditando dalla finestra di tema predefinito Sherlock, e ignorando la barra di avanzamento utilizzando la barra di avanzamento in stile come definito dalla mia generata tema "greenhighlight" — puoi vedere che la barra di avanzamento è la giusta tonalità di verde nello screenshot qui sopra.

Per utilizzare il tema, sto correndo il seguente codice:

ContextThemeWrapper ctw = 
    new ContextThemeWrapper(this, R.style.greenhighlight_Dialog); 
AlertDialog.Builder builder = new AlertDialog.Builder(ctw); 
... 
ProgressDialog pd = new ProgressDialog(this, R.style.greenhighlight_Dialog); 
... 

Il mio problema è che non ho idea di cosa gli attributi che ho bisogno di ignorare. Ho cercato attraverso styles.xml e themes.xml come raccomandato dal Styles and Themes doco (che rileva che "il riferimento a R.style, tuttavia, non è ben documentato e non descrive completamente gli stili") — ma ci sono molti stili definiti su Theme.Dialog e non sono sicuro su quali devo sovrascrivere per ottenere il cambiamento che voglio.

Quali attributi ho bisogno di sovrascrivere per le mie finestre di dialogo per avere il testo del titolo verde, una barra evidenziata verde sotto il titolo e segni di spunta verdi per gli elementi dell'elenco controllati?

+0

Bella domanda. Per favore, leggi questa riga su [ActionBarSherlock - Theming] (http://actionbarsherlock.com/theming.html): * Non saranno inclusi temi di dialogo aggiuntivi. Se hai bisogno di alcune delle funzionalità più avanzate delle finestre di dialogo, devono essere implementate da te. * –

+1

@PareshMayani: sì, ho letto quella riga - è per questo che sto implementando il mio tema di dialogo. – George

risposta

23

Sono andato a scavare intorno alla fonte e ho trovato il file di layout alert_dialog_holo.xml. Questa è la visione di divisione:

<View android:id="@+id/titleDivider" 
    android:layout_width="match_parent" 
    android:layout_height="2dip" 
    android:visibility="gone" 
    android:background="@android:color/holo_blue_light" /> 

Nella classe AlertController, è la visibilità è impostato su VISIBLE se c'è un titolo presente. Poiché il colore è hardcoded, non ci sarà un modo per sovrascriverlo con un attributo style.

Questo è il titolo della vista:

<com.android.internal.widget.DialogTitle android:id="@+id/alertTitle" 
    style="?android:attr/windowTitleStyle" 
    android:singleLine="true" 
    android:ellipsize="end" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" /> 

in modo che utilizza la windowTitleStyle.Ci sono voluti un sacco di caccia, ma alla fine ho trovato lo stile che utilizza:

<style name="TextAppearance.Holo.DialogWindowTitle"> 
    <item name="android:textSize">22sp</item> 
    <item name="android:textColor">@android:color/holo_blue_light</item> 
</style> 

seguito gli stili genitore indietro, sono stato in grado di cambiare il colore del testo solo tramite stili:

<style name="AppTheme" parent="@android:style/Theme.Holo"> 
    <item name="android:alertDialogTheme">@style/AlertDialogStyle</item> 
</style> 

<style name="AlertDialogStyle" parent="@android:style/Theme.Holo.Dialog"> 
    <item name="android:windowBackground">@android:color/transparent</item> 
    <item name="android:windowContentOverlay">@null</item> 
    <item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item> 
    <item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item> 
    <item name="android:windowTitleStyle">@style/DialogWindowTitle</item> 
</style> 

<style name="DialogWindowTitle"> 
    <item name="android:maxLines">1</item> 
    <item name="android:scrollHorizontally">true</item> 
    <item name="android:textAppearance">@style/DialogWindowTitleAppearance</item> 
</style> 

<style name="DialogWindowTitleAppearance" parent="@android:style/TextAppearance.Holo.DialogWindowTitle"> 
    <item name="android:textColor">#00ff00</item> 
</style> 

Ora, per il divisore, non è possibile modificarlo tramite gli stili, ma poiché si conosce l'id, è possibile estendere la classe AlertDialog e intercettarla quando crea il layout (onCreate) e modificarne il colore. Anche se questo è gestito nella classe privata AlertController, quindi non sono sicuro della fortuna che avrai. Approfondirò di più e tornerò se inventerò qualcosa.

+0

Ciao jason grazie per l'ottimo lavoro. Funziona bene per tutte le altre cose, come cambiare il colore del testo dell'intestazione e così via, ma quando ho provato a cambiare l'altezza del divisore o il colore del divisore è riflesso nella vista. Puoi spiegare come farlo .. hai bisogno di aiuto ... grazie ... – nilkash

+1

@nilkash, Quello che ho finito per aggirare questo era di non impostare il titolo e utilizzare un layout di messaggio personalizzato. Nel mio layout di messaggio personalizzato ho creato il mio divisore che corrisponde al mio tema. –

+0

@pegisys grazie risposta. Ma non so scavalcare quel colore divisorio per abbinarlo alla mia app .. Ho fatto molte cose ma non sono riuscito a farlo. principalmente per la finestra di contesto e il dialogo. Sono in grado di modificare il testo e ascoltare il testo o impostare l'intestazione personalizzata per il contesto ma non riesco ancora a cambiare il colore del divisore dell'intestazione ... Hai bisogno del tuo aiuto Grazie ... – nilkash

2

ho trovato una soluzione per rimuovere il divisore: basta aggiungere la seguente riga nel vostro stile di dialogo avviso personalizzato (si veda AlertDialogStyle in risposta di Jason Robinson):

<item name="android:divider">@null</item>" 

Poi il divisore sarà andato.

Se si desidera aggiungere un divisore personalizzato, è possibile aggiungerlo nel layout del contenuto personalizzato.

Problemi correlati