2010-06-25 14 views
19

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:¿Cómo puedo cambiar el fondo de los cuadros de diálogo de alerta de Android?

<style name="MyOpaqueActivity" parent="@android:style/Theme.Dialog"> 
    <item name="android:windowBackground">@drawable/my_background</item> 
    <item name="android:alertDialogStyle">@style/MyOpaqueAlertDialog</item> 
</style> 

<style name="MyOpaqueAlertDialog" parent="@android:style/Theme.Dialog.Alert"> 
    <item name="android:background">#454545</item> 
    <item name="android:windowBackground">@drawable/my_background</item> 
    <item name="android:popupBackground">@drawable/my_background</item> 
</style> 

que aplica el estilo "MyOpaqueActivity" con éxito para actividades enteros (el fondo de la ventana se cambia a "my_background"), pero no funciona para los cuadros de diálogo 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?

Respuesta

11

Su enfoque no funcionará. Parece AlertDialog (y Constructor) codificar el tema y no respetan alertDialogStyle en cualquier lugar:

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

Una clase de diálogo personalizado derivado de AlertDialog que llama al constructor protegida AlertDialog (contexto, 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?).

+1

¿Puede explicar su respuesta un poco, porque es inexacta? En primer lugar, no es cierto que la pregunta a la que se refiere discute el tema del diálogo de alerta ** fondos **; allá, se trata de botones. En segundo lugar, el hecho de que el nombre de un tema esté codificado no significa que el tema no se pueda personalizar. –

3

Desde el documentation 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 cuadro de diálogo personalizado que utiliza ese tema.

4

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

Sin embargo, sería interesante saber a qué versión de Android se refiere (o tiene como objetivo). 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:

<style name="MyTheme" parent="@android:style/Theme"> 
    <item name="android:alertDialogStyle">@style/MyOpaqueAlertDialog</item> 
</style> 

<style name="MyOpaqueAlertDialog"> 
    <item name="android:fullDark">@drawable/[...]</item> 
    <item name="android:topDark">@drawable/[...]</item> 
    <item name="android:centerDark">@drawable/[...]</item> 
    <item name="android:bottomDark">@drawable/[...]</item> 
    <item name="android:fullBright">@drawable/[...]</item> 
    <item name="android:topBright">@drawable/[...]</item> 
    <item name="android:centerBright">@drawable/[...]</item> 
    <item name="android:bottomBright">@drawable/[...]</item> 
    <item name="android:bottomMedium">@drawable/[...]</item> 
    <item name="android:centerMedium">@drawable/[...]</item> 
</style> 

versiones más recientes de Android también tienen android: progressLayout y Android: Atributos 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.

Desafortunadamente, la documentación de qué característica se agregó cuando es muy mala. Por favor, descubra por usted mismo qué enfoque es el mejor para usted.

Cuestiones relacionadas