El tema del diálogo Android hace que el icono sea demasiado claro

He creado una nueva aplicación en Eclipse, dirigida a Jelly Bean. Todo esto es código creado automáticamente. El manifiesto establece el tema de la aplicación en AppName:

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

Que se traduce en AppBaseTheme para estilos en los valores 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> 

Y valores-v14 / styles.xml es:

 <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> 

A continuación, creé un cuadro de diálogo de confirmación antes de salir:

  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(); } 

Y el cuadro de diálogo resultante es:

Cuadro de diálogo resultante

¿Por qué el ic_dialog_icon es tan ligero? Es apenas visible. Estoy utilizando todos los valores por defecto, no modificar el tema o cualquier color, ¿No debería el sistema elegir un icono con más contraste con su fondo? ¿Cómo puedo arreglarlo?

Editar con corrección
Después de Tomik info he leído la documentación de android.R.attr.alertDialogIcon y hecha esta corrección ( setIcon () reemplazado 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() { 

Ahora el cuadro de diálogo tiene este aspecto:

Introduzca aquí la descripción de la imagen

El problema es que estás utilizando recurso privado android.R.drawable.ic_dialog_alert .

El uso de recursos privados es problemático, pueden variar en diferentes dispositivos y ni siquiera puede estar seguro de que estén presentes en todos los dispositivos. Lo mejor es evitar el uso de recursos privados. Si los necesita, debe copiarlos de fuentes de Android y ponerlos en los recursos de su proyecto.

La razón exacta por la que su recurso es demasiado blanco es que está utilizando el recurso ( android.R.drawable.ic_dialog_alert ) que se utiliza para el tema estándar (no Holo).
Pero para los dispositivos que ejecutan Android 4.x (API nivel 14) que están utilizando tema Holo ( android:Theme.Holo.Light.DarkActionBar ) que normalmente está utilizando diferentes recursos.

Con el tema de Holo el icono de alerta predeterminado es android.R.id.ic_dialog_alert_holo_dark para el tema oscuro o android.R.id.ic_dialog_alert_holo_light para el tema de luz (su caso, debe utilizar este recurso).

Nota: Desde el nivel 11 de API hay un atributo android.R.attr.alertDialogIcon que hace referencia al icono de diálogo de alerta predeterminado para el tema actual. En tu código puedes usarlo de esta manera:

 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(); } 

Sin embargo, recomiendo copiar el recurso de fuentes de Android a los recursos de su proyecto, porque esa es la única manera que puede estar seguro de que el icono siempre se verá igual.

Un workround basado en la respuesta de Tomik para pre-HC si usted está usando el tema ligero en esos dispositivos también:

 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); } 
  • ¿Cómo proporcionar opciones de temas en una aplicación de Android?
  • Android: los márgenes especificados en estilo personalizado no tienen efecto
  • Separación de recursos / archivos a diferentes apk para pelar
  • Configuración del texto como "primario" en Android
  • Por qué mi animación de actividad cercana no funciona en Android 4.0 (ICS)
  • Cambiar el estilo de AlertDialog
  • ¿Cómo puedo hacer que la barra de estado sea blanca con iconos negros?
  • App crash cuando android: el tema se aplica a un botón específico
  • Encontrar todos los estilos disponibles definidos por los temas de la plataforma Android
  • Tema / estilo no se aplica cuando se utiliza inflater con ApplicationContext
  • ¿Cómo se elimina la línea / sombra del separador entre la barra de estado y la pantalla principal?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.