Sto lottando con questo problema da un po 'di tempo. Ho cercato soluzioni e c'erano in realtà alcuni suggerimenti per problemi correlati, ma nulla ha funzionato correttamente per me. Quindi diciamo che voglio creare un AlertDialog con un messaggio (lungo), una casella di controllo e due pulsanti.Colore/aspetto del testo corretto in AlertDialog
// create dialog
AlertDialog.Builder dlg = new AlertDialog.Builder(this);
dlg.setTitle(R.string.dlg_title);
dlg.setMessage(R.string.dlg_msg);
// add checkbox
final CheckBox checkbox = new CheckBox(this);
dlg.setView(checkbox);
// add buttons
dlg.setPositiveButton(...);
dlg.setNegativeButton(...);
// show dialog
dlg.show();
Questo non funzionerà, perché se il messaggio di dialogo diventa troppo lungo, la casella di controllo non verrà mostrata completamente. Inoltre, sarà completamente nascosto in modalità orizzontale.
Il prossimo tentativo sarebbe di cercare il original dialog layout file (per me si trova sotto android-sdk-linux_86/piattaforme/android-17/data/res/layout/alert_dialog.xml) e tentare di copiare la parte rilevante per creare nostro "clone" del layout dialogo interno, proprio come questo:
dialog_checkbox.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical" >
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:overScrollMode="ifContentScrolls"
android:paddingBottom="12dip"
android:paddingLeft="14dip"
android:paddingRight="10dip"
android:paddingTop="2dip" >
<TextView
android:id="@+id/message"
style="?android:attr/textAppearanceMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dip" />
</ScrollView>
<CheckBox
android:id="@+id/checkbox"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
potremmo provare ad aggiungere questa vista per il nostro dialogo come questo:
// create dialog
AlertDialog.Builder dlg = new AlertDialog.Builder(this);
dlg.setTitle(R.string.dlg_title);
// add checkbox
LinearLayout checkboxLayout = (LinearLayout) View.inflate(mContext, R.layout.dialog_checkbox, null);
((TextView) checkboxLayout.findViewById(R.id.message)).setText(R.string.dlg_msg);
mCheckbox = (CheckBox) checkboxLayout.findViewById(R.id.checkbox);
mCheckbox.setText(R.string.dlg_checkbox_msg);
setView(checkboxLayout);
// add buttons
dlg.setPositiveButton(...);
dlg.setNegativeButton(...);
// show dialog
dlg.show();
Questo funziona davvero piuttosto bene. Quasi. Non vedremo alcun problema finché non useremo Theme.Light per la nostra app. Ma non appena usiamo Theme.Light, i colori del testo della finestra di dialogo diventeranno neri e illeggibili sullo sfondo scuro. PERCHÉ ?!
- Abbiamo clonato il codice sorgente originale di allerta di dialogo xml di Android. Ma sebbene usiamo attr/textAppearanceMedium come stile di testo, il colore del testo diventa nero sotto Theme.Light comunque.
- Se usiamo Theme.Light e creiamo una finestra di dialogo "normale" con un messaggio normale tramite setMessage, il colore del testo è bianco e leggibile.
Cosa c'è che non va? Come risolvere questo? Non desidero impostare a livello di codice il colore del testo su bianco o nero, questo non sarà ottimale per i temi utente personalizzati. Eventuali suggerimenti?
Come detto, non preferisco questa soluzione. Cosa succede se qualcuno usa un tema personalizzato, in cui le finestre di dialogo hanno uno sfondo chiaro e un colore del testo scuro? Avranno problemi allora. Questa soluzione non è affatto pulita secondo me. – flxapps
no, puoi provarlo perché se renderai textcolor white esplicitamente, sostituirà il colore predefinito di qualsiasi tema. –
Non capisci. Alcuni utenti Android dispongono di ROM personalizzate e alcune di queste ROM personalizzate sono individualmente a tema. E alcuni di quei singoli temi potrebbero avere colori molto vivaci. E alcuni di quei temi dai colori vivaci potrebbero avere sfondi di dialogo luminosi. E quei temi che hanno sfondi di dialogo luminosi utilizzeranno logicamente i colori del testo scuro per rendere leggibile il testo del dialogo. E se sostituisco i colori di questo testo con il bianco, verrà visualizzato un testo bianco su uno sfondo luminoso. Saresti in grado di leggere il testo bianco su uno sfondo bianco? Io non la penso così ... – flxapps