¿Cómo puedo cambiar el fondo de los cuadros de diálogo de alerta de Android?

Uso la clase AlertDialog en mi aplicación. De forma predeterminada, estos cuadros de diálogo de alerta tienen un fondo transparente. Intento utilizar un fondo opaco en su lugar, sin éxito. Estos son mis estilos:

 @drawable/my_background @style/MyOpaqueAlertDialog   #454545 @drawable/my_background @drawable/my_background  

Apliqué el estilo “MyOpaqueActivity” exitosamente para actividades completas (el fondo de la ventana se cambió a “my_background”), pero no funciona para diálogos de alerta dentro de esas actividades. El atributo “alertDialogStyle” y mi estilo “MyOpaqueAlertDialog” no parecen tener ningún efecto.

Entonces, ¿cómo puedo cambiar el fondo de estos cuadros de diálogo de alerta?

Tu enfoque no funcionará. Parece que AlertDialog (y Builder) codifican el tema y no respetan alertDialogStyle en ninguna parte:

 protected AlertDialog(Context context) { this(context, com.android.internal.R.style.Theme_Dialog_Alert); } public Builder(Context context) { this(context, com.android.internal.R.style.Theme_Dialog_Alert); } 

Llegaron a la misma conclusión aquí .

Una clase de diálogo personalizado derivado de AlertDialog que llama al constructor protegido AlertDialog (context, R.style.MyOpaqueAlertDialog) sería una solución.

En la última fuente de Android, hay un nuevo constructor público para AlertDialog.Builder que toma un argumento de tema. Desafortunadamente, aún no se ha lanzado (¿tal vez en Gingerbread?).

Es fácil hacer esto en un estilo XML una vez que cree que los AlertDialogs tienen atributos algo especiales.

Sin embargo, sería interesante saber a qué versión de Android se refiere (o a quién se dirige). Theme.Dialog es relativamente nuevo hasta donde yo sé. Las versiones más nuevas de Android tampoco usan AlertDialog en todas las circunstancias en que las versiones anteriores las usaban.

Esto funciona para mí en Android 2.2:

   

Las versiones más nuevas de Android también tienen los atributos android: progressLayout y android: horizontalProgressLayout para el estilo AlertDialog.

Además, en las versiones más nuevas de Android, es posible hacer referencia a un tema de AlertDialog mediante el uso de alertDialogTheme en lugar de alertDialogStyle en un tema personalizado. AlertDDialogThemes admite atributos más familiares y más potentes, como windowBackground, windowTitleStyle, etc. Eche un vistazo a styles.xml y themes.xml.

Lamentablemente, la documentación de la función que se agregó cuando es super pobre. Por favor, descubra por usted mismo qué enfoque es el mejor para usted.

De la documentación parece que podría hacer esto en onCreateDialog.

 FrameLayout fl = (FrameLayout) findViewById(android.R.id.custom); fl.setBackgroundResource(); // has to be a drawable. 

Solo otra solución es un diálogo personalizado que usa ese Tema.