2011-10-14 14 views
7

Sto tentando di mostrare una finestra di dialogo da PreferenceActivity, che è impostata su Theme.Light. La finestra di dialogo mostra con testo scuro su uno sfondo scuro:Android: problema con la visualizzazione della finestra di dialogo dall'attività Theme.Light

enter image description here

suppongo che utilizza il testo scura perché eredita il colore del testo dall'attività genitore, o qualcosa di simile. Vorrei che la finestra di dialogo utilizzasse il testo bianco sullo sfondo scuro o usasse uno sfondo bianco con testo scuro, come fa PreferenceActivity se impostato su Theme.Light.

Questo sembra essere un problema noto, i rimedi che ho trovato comportano la creazione e l'utilizzo di uno stile personalizzato che estende Theme.Dialog e utilizzandolo per istanziare la finestra di dialogo. Qualcosa di simile:

<style name="CustomDialog" parent="@android:style/Theme.Dialog"> 
<item name="android:textColor">?android:attr/textColorPrimaryInverseDisableOnly</item> 
</style> 

Dialog dialog = new Dialog(context, R.style.CustomDialog); 

Ho provato questo, ma non ha fatto alcuna differenza. Ho anche provato un numero di valori diversi per textColor, nessuno dei quali ha modificato il colore del testo della finestra di dialogo. Come un controllo di integrità, ho aggiunto:

 <item name="android:background">#FFFF0000</item> 

allo stile, che ha portato in una finestra con uno sfondo rosso (quindi sono sicuro che sto istanziare la finestra di dialogo correttamente).

Il più vicino possibile a una soluzione è semplicemente impostare il colore di sfondo della finestra di dialogo su bianco, che fornisce la seguente finestra di dialogo. Ma questa non è una buona soluzione, perché alcuni versione o qualche dispositivo potrebbe non utilizzare lo stesso comportamento che sto vedendo quando invertendo il colore del testo:

enter image description here

Quindi, c'è un buon modo per impostare il colore del testo su un finestra di dialogo visualizzata da un'attività Theme.Light?

+0

Mi sembra di ricordare di lottare con qualcosa di simile. Non l'ho mai fatto funzionare. La mia soluzione alternativa era quella di avere risorse a valore multiplo, una che definiva i colori come scuri per Gingerbread, cioè in res/values-v8 e come luce in res/values. –

+0

La mia tentazione è di hardcode lo sfondo della lista in bianco, e il colore del testo della lista in nero. Nella speranza che ciò garantisca il testo nero su sfondo bianco, indipendentemente dal dispositivo o dalla versione. – ab11

+0

Beh sì, funzionerebbe sicuramente. Ma ho pensato che il punto di questo dolore fosse quello di fondersi con il tema del dispositivo ...Il pan di zenzero era molto più scuro delle versioni precedenti, quindi è il caso speciale. –

risposta

1

Presumo che si utilizzi AlertDialog.Builder e si imposta l'elenco utilizzando uno dei metodi setSingleChoiceItems che non utilizza il proprio ListAdapter. Invece crea il proprio invece con lo stile sbagliato. Per risolvere questo problema, è necessario chiamare setSingleChoiceItems(ListAdapter adapter, int checkedItem, DialogInterface.OnClickListener listener) e fornire un tale adattatore che utilizzi un layout con lo stile necessario.

Ora, perché questo accade. La creazione adattatore effettivo avviene nel file com.android.internal.app.AlertController, dove la seguente riga seleziona il layout per gli elenchi di scelte singoli:

int layout = mIsSingleChoice 
        ? R.layout.select_dialog_singlechoice : R.layout.select_dialog_item; 

Ecco la disposizione di cui sopra:

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:minHeight="?android:attr/listPreferredItemHeight" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:textColor="@android:color/primary_text_light_disable_only" 
    android:gravity="center_vertical" 
    android:paddingLeft="12dip" 
    android:paddingRight="7dip" 
    android:checkMark="@android:drawable/btn_radio" 
    android:ellipsize="marquee" 
/> 

Come si può vedere, la linea che imposta il colore del testo non contiene un riferimento a un tema, ma un colore cablato. Ecco perché quando questa cosa viene gonfiata durante la creazione della lista, utilizzerà sempre lo stesso colore, indipendentemente dallo stile che si desidera utilizzare. Quindi l'azione giusta per superare questo problema è utilizzare il proprio layout e il proprio ListAdapter.

Problemi correlati