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:
- El significado de android: colorForeground
- ¿Cómo cambiar el tema predeterminado de la aplicación a un tema de aplicación diferente?
- Configuración del estilo de TextViews subyacentes en style.xml
- Cómo configurar width / height para cualquier widget a través de Theme en Android
- Cómo diseñar DialogPreference con un tema personalizado?
<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:
¿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:
- Elegir un estilo / tema mediante programación en tiempo de ejecución
- Android: clipToPadding no funciona desde el tema, pero funciona como un estilo
- Modificación del diseño del título de diálogo en Android
- Cambiar el color azul por defecto en el tema de Android holo a naranja (o cualquier otra cosa)
- Nombre del tema de Android del ID de tema
- Cambiar el color de la barra de acciones de Android 5.0
- Cómo cambiar el tema actual en tiempo de ejecución en Android
- Error: Error al recuperar el padre del elemento: No se encontró ningún recurso que coincida con el nombre dado 'android: Theme.Holo'
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 configurar el relleno para el widget CardView en Android L
- ¿Está garantizado un servicio android para llamar a onDestroy ()?