2013-02-16 3 views
42

Ho creato una nuova applicazione in Eclipse, destinata a Jelly Bean. Questo è tutto il codice creato automaticamente. I set manifestano il tema applicazione per AppName:Il tema della finestra di dialogo Android rende l'icona troppo chiara

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    . . . 

che si traduce in AppBaseTheme per gli stili nei valori dir:

<resources xmlns:android="http://schemas.android.com/apk/res/android"> 

    <!-- 
     Base application theme, dependent on API level. This theme is replaced 
     by AppBaseTheme from res/values-vXX/styles.xml on newer devices. 
    --> 
    <style name="AppBaseTheme" parent="android:Theme.Light"> 
     <!-- 
      Theme customizations available in newer API levels can go in 
      res/values-vXX/styles.xml, while customizations related to 
      backward-compatibility can go here. 
     --> 
    </style> 

    <!-- Application theme. --> 
    <style name="AppTheme" parent="AppBaseTheme"> 
     <!-- All customizations that are NOT specific to a particular API-level can go here. --> 
    </style> 

</resources> 

e valori-V14/styles.xml è:

<resources> 

    <!-- 
     Base application theme for API 14+. This theme completely replaces 
     AppBaseTheme from BOTH res/values/styles.xml and 
     res/values-v11/styles.xml on API 14+ devices. 
    --> 
    <style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar"> 
     <!-- API 14 theme customizations can go here. --> 
    </style> 

</resources> 

Ho quindi creato una finestra di dialogo di conferma prima di uscire:

case R.id.menu_quit: 
     new AlertDialog.Builder(this) 
     .setIcon(android.R.drawable.ic_dialog_alert) 
     .setTitle(R.string.confirm_title) 
     .setMessage(R.string.confirm_text) 
     .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       finish();  
      } 

E la finestra di dialogo risultante è:

resulting dialog box

Perché l'ic_dialog_icon così leggero? È appena visibile. Sto usando tutti i valori di default, non ho modificato il tema o nessun colore, il sistema non dovrebbe scegliere un'icona con più contrasto con lo sfondo? Come posso ripararlo?

Modifica con correzione
seguenti informazioni Tomik ho letto la documentazione per android.R.attr.alertDialogIcon e ha reso questa correzione (sostituito setIcon() con setIconAttribute())

 new AlertDialog.Builder(this) 
     .setIconAttribute(android.R.attr.alertDialogIcon) 
     .setTitle(R.string.confirm_title) 
     .setMessage(R.string.confirm_text) 
     .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 

Ora la finestra di dialogo si presenta così:

enter image description here

risposta

43

Il problema è che si sta utilizzando la risorsa privata android.R.drawable.ic_dialog_alert.

L'utilizzo di risorse private è problematico, può variare su diversi dispositivi e non si può nemmeno essere sicuri che siano presenti su tutti i dispositivi. La cosa migliore è evitare di usare risorse private. Se ne hai bisogno, dovresti copiarli da fonti Android e metterle nelle risorse del tuo progetto.

Il motivo esatto per cui la risorsa è troppo bianca è che si sta utilizzando una risorsa (android.R.drawable.ic_dialog_alert) utilizzata per il tema standard (non Holo).
Ma per i dispositivi con Android 4.x (livello API 14) si utilizza il tema Holo (android:Theme.Holo.Light.DarkActionBar) che utilizza normalmente una risorsa diversa.

Con il tema Holo, l'icona di avviso predefinita è android.R.id.ic_dialog_alert_holo_dark per il tema scuro o android.R.id.ic_dialog_alert_holo_light per il tema della luce (nel caso specifico, è necessario utilizzare questa risorsa).

Nota: dal livello API 11 è presente un attributo android.R.attr.alertDialogIcon che fa riferimento all'icona di dialogo di avviso predefinita per il tema corrente. Nel codice è possibile utilizzare in questo modo:

case R.id.menu_quit: 
    new AlertDialog.Builder(this) 
    .setIconAttribute(android.R.attr.alertDialogIcon) 
    .setTitle(R.string.confirm_title) 
    .setMessage(R.string.confirm_text) 
    .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      finish();  
     } 

Ancora mi consiglia di copiare la risorsa da fonti Android per le risorse del progetto, perché questo è l'unico modo in cui si può essere sicuri che l'icona sarà sempre lo stesso aspetto.

+0

seguito il commento ho letto informazioni e fissare il codice. In breve aggiornerò la domanda per riflettere i risultati. ::: BTW Non sono preoccupato del fatto che le icone dovrebbero apparire sempre uguali, solo che sono visibili. – ilomambo

+0

E per quanto riguarda le finestre di informazione? C'è un simile '.setIconAttribute (android.R.attr. ????)' da utilizzare al posto di '.setIcon (android.R.drawable.ic_dialog_info)' – JFar

1

Un workround basa su Tomik's answer per il pre-HC se si sta utilizzando il tema luce su questi dispositivi troppo:

AlertDialog.Builder builder = ...; 
if (VERSION.SDK_INT < VERSION_CODES.HONEYCOMB) { 
    Drawable icon = ContextCompat.getDrawable(context, android.R.drawable.ic_dialog_alert).mutate(); 
    icon.setColorFilter(new ColorMatrixColorFilter(new float[] { 
      -1, 0, 0, 0, 255, // red = 255 - red 
      0, -1, 0, 0, 255, // green = 255 - green 
      0, 0, -1, 0, 255, // blue = 255 - blue 
      0, 0, 0, 1, 0  // alpha = alpha 
    })); 
    builder.setIcon(icon); 
} else { 
    builder.setIconAttribute(android.R.attr.alertDialogIcon); 
} 
Problemi correlati