studio programacion para herramientas fundamentos desarrollo con avanzado aplicaciones android icons themes alertdialog

programacion - manual android studio avanzado



El tema del diálogo de Android hace que el icono sea demasiado claro (2)

Creé una nueva aplicación en Eclipse, dirigida a Jelly Bean. Esto es todo el 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 los estilos en el directorio de valores:

<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 los valores-v14 / styles.xml son:

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

Entonces 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 predeterminados, no modifiqué el tema ni ninguno de los colores. ¿No debería el sistema elegir un icono que tenga más contraste con el fondo? ¿Cómo puedo arreglarlo?

Editar con arreglo
Siguiendo la información de Tomik, leí la documentación de android.R.attr.alertDialogIcon e hice esta revisión (reemplazé 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() {

Ahora el diálogo se ve así:


El problema es que está utilizando el 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 las 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 resource ( android.R.drawable.ic_dialog_alert ) que se usa para el tema estándar (que no es Holo).
Pero para los dispositivos que ejecutan Android 4.x (nivel de API 14), está utilizando el tema Holo ( android:Theme.Holo.Light.DarkActionBar ), que normalmente utiliza un recurso diferente.

Con el tema Holo, el ícono 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 light (en su caso, debe usar este recurso).

Nota: Desde el nivel 11 de la API, hay un atributo android.R.attr.alertDialogIcon que se refiere al ícono 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(); }

Aún así, recomiendo copiar el recurso de las fuentes de Android a los recursos de su proyecto porque esa es la única forma en que puede estar seguro de que el ícono siempre se verá igual.


Un entorno de trabajo basado en la respuesta de Tomik para pre-HC si también está usando un tema ligero en esos dispositivos:

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