2012-12-25 21 views
8

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?

risposta

0

Appena dentro TextView aggiungere un attributo:

android:textColor="@color/white" 

e definire il colore bianco all'interno colors.xml che è res all'interno/valori cartella

<color name="white">#ffffff</color> 

o si può aggiungere direttamente

android:textColor="#fffff" (sebbene non raccomandato. È raccomandato il metodo sopra).)

+0

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

+0

no, puoi provarlo perché se renderai textcolor white esplicitamente, sostituirà il colore predefinito di qualsiasi tema. –

+0

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

0

È possibile applicare uno stile personalizzato con un ombra per rendere il testo visibile qualunque sia il colore del testo è il seguente:

<resources> 
<style name="Text.Shaded.Medium" parent="@android:attr/textAppearanceMedium"> 
    <item name="@android:paddingLeft">4dp</item> 
    <item name="@android:paddingBottom">4dp</item> 
    <item name="@android:textColor">#FFFFFFFF</item> 
    <item name="@android:shadowColor">#000000</item> 
    <item name="@android:shadowDx">2</item> 
    <item name="@android:shadowDy">2</item> 
    <item name="@android:shadowRadius">2</item> 
</style> 
</resources> 

Tuttavia se non è abbastanza visibile per te è possibile applica un'ombra interna, ma sfortunatamente Android non ha una proprietà per questo, quindi dovrai usare qualcosa come MagicTextView (menzionato da ABentSpoon in questa domanda: Is there a way to add inner shadow to a TextView on Android?).

+1

Anche questa soluzione si confonde con l'aspetto della finestra di dialogo predefinita. Rende l'aspetto del dialogo insolito e strano per l'utente. Non preferisco una soluzione del genere. – flxapps

1

I THINK Ho finalmente scoperto come risolverlo. Sulla base del mio codice iniziale, questo sembra risolvere il mio problema:

// add checkbox layout 
LinearLayout checkboxLayout = (LinearLayout) View.inflate(new ContextThemeWrapper(context, android.R.style.Theme_Dialog), R.layout.dialog_checkbox, null); 
((TextView) checkboxLayout.findViewById(R.id.message)).setText(DIALOG_TEXT); 
mCheckbox = (CheckBox) checkboxLayout.findViewById(R.id.checkbox); 
mCheckbox.setText(CHECKBOX_NOT_AGAIN); 
setView(checkboxLayout); 

Annotare la ContextThemeWrapper. Rende che il tema della finestra di dialogo sia assegnato al layout gonfiato. Spero che questo risolva finalmente questo problema per il futuro.

+0

No. Sembra che non funzioni su Android 4 ... dannazione. Qualcuno può trovare una soluzione adeguata? – flxapps

19

Ho avuto lo stesso problema e risolto con la creazione di un ContextThemeWrapper per il mio tema di dialogo desiderato e usato questo durante la creazione del AlertDialog Builder e quando si gonfia la vista da allegare:

ContextThemeWrapper wrapper = new ContextThemeWrapper(this, R.style.DialogBaseTheme); 
AlertDialog.Builder builder = new AlertDialog.Builder(wrapper); 
View view = LayoutInflater.from(wrapper).inflate(R.layout.create_warning, null); 
builder.setView(view); 

Lo stile R.style. DialogBaseTheme è definita "/values/styles.xml" per Gingerbread e sotto come:

<style name="DialogBaseTheme" parent="android:Theme.Dialog"/> 

Poi viene anche definito "/values-v11/styles.xml" per Honeycomb e verso l'alto per utilizzare il tema Holo come:

<style name="DialogBaseTheme" parent="android:Theme.Holo.Light.Dialog" /> 

Così su Gingerbread le mie immagini personalizzate Le viste di testo sono automaticamente colorate di bianco e Honeycomb + sono automaticamente colorate di nero per Holo Light.

+2

Mi sono sempre chiesto come fare. Questo funziona perfettamente. – nlawson

+0

Grazie mille per questa risposta! Funziona perfettamente! –

Problemi correlati