2010-03-26 12 views
14

¿Alguien sabe cómo anular el estilo predeterminado para los botones de AlertDialog? Revisé la fuente de Android para themes y styles y experimenté con cosas diferentes, pero no he podido encontrar la manera de hacerlo.Estilo de botón en AlertDialogs

Lo que tengo a continuación funciona para cambiar los fondos, pero no hace nada con los botones. myTheme se aplica al total <application> a través del manifiesto. (Algunos otros elementos se eliminaron para mayor claridad, pero solo se relacionan con la barra de título.)

<style name="myTheme" parent="android:Theme"> 
    <item name="android:buttonStyle">@style/customButtonStyle</item> 
    <item name="android:alertDialogStyle">@style/dialogAlertTheme</item> 
</style> 

<style name="dialogAlertTheme" parent="@android:style/Theme.Dialog.Alert"> 
    <item name="android:fullDark">@drawable/dialog_loading_background</item> 
    <item name="android:topDark">@drawable/dialog_alert_top</item> 
    <item name="android:centerDark">@drawable/dialog_alert_center</item> 
    <item name="android:bottomDark">@drawable/dialog_alert_bottom</item> 
    <!-- this last line makes no difference to the buttons --> 
    <item name="android:buttonStyle">@style/customButtonStyle</item> 
</style> 

¿Alguna idea?

Respuesta

2

Supongo que tiene que implementar su propia clase Dialog.

+4

Hmm. Eso sería molesto; cambiar los botones de diálogo no debería ser una cosa inusual, ya que es fácil aplicar un estilo de botón a los botones de actividad 'normal'. –

+0

En actividades normales, define el diseño de la vista de contenido con un xml. Dialog hace esto por usted, por lo que no tiene acceso al diseño xml. La implementación de su propio diálogo (posiblemente solo con una llamada setContentView()) le permite usar un xml diferente y, por lo tanto, diferentes estilos para los botones. – MrSnowflake

+1

¿Cómo clasificaría AlertDialog para que pueda usar AlertDialog.Builder con su subclase? –

23

Dado que el razonamiento de MrSnowflake es inexacto, me estoy tomando la libertad de dar otra respuesta.

Hay algo mal con el marcado en cuestión de Steve Haley, y se está mezclando hasta alertDialogStyle y alertDialogTheme, muy probablemente debido al hecho de que alertDialogTheme se introdujo mucho después alertDialogStyle estaba cerca.

Así que aunque @android: style/Theme.Dialog.Alert esté disponible en su plataforma Andoid, aún no puede utilizar su poder de expresión enganchando una versión personalizada en su propio tema a menos que su plataforma Android admita un android: alertDialogTheme atributo/elemento para temas. (Puede o no ser el caso de que existan versiones de Android tan incoherentes, no estoy seguro. Pero el marcado utilizado en la pregunta sugiere que sí.)

En el marcado de la pregunta, el padre = " @android: style/Theme.Dialog.Alert "no hará nada excepto crear la ilusión de que está personalizando el tema del diálogo de alerta cuando en realidad solo está personalizando el estilo de diálogo de alerta.

Así se verá el marcado; no todas las versiones de Android admiten todas las funciones.

<style name="myTheme" parent="android:Theme"> 
    <item name="android:buttonStyle">@style/customButtonStyle</item> 
    <item name="android:alertDialogStyle">@style/dialogAlertStyle</item> 
    <item name="android:alertDialogTheme">@style/dialogAlertTheme</item> 
</style> 

<style name="dialogAlertStyle" parent="@android:style/AlertDialog"> 
    <item name="android:fullDark">[...]</item> 
    [...] 
</style> 

<style name="dialogAlertTheme" parent="@android:style/Theme.Dialog.Alert"> 
    <item name="android:windowBackground">[...]</item> 
    [...] 
</style> 

Personalización del estilo de diálogo de alerta ha sido de alrededor durante bastante tiempo, pero se limita a proporcionar (fondo) dibujables para "fullDark", "topDark", etc.

Personalizar el tema de diálogo de alerta se abre un método para proporcionar atributos como windowBackground, windowTitleStyle y demás, pero como se dijo anteriormente, necesita una versión de Android que admita el atributo/elemento alertDialogThem para temas. No puedo averiguar exactamente cuándo se presentó esto, pero no ha sido Android 2.2 y Eclipse te dirá de todos modos ...

No tengo los recursos para validar la conclusión de MrSnowflake de que es imposible dar estilo al diálogo de alerta botones en XML, pero a menos que enfrentemos uno de esos aspectos algo desagradables de Android en los que realmente falta una característica, me parece poco probable.

Como cuestión de hecho, lo que falta en la pregunta es la parte más relevante a este respecto, a saber

<style name="customButtonStyle" /> 

por lo que la conclusión de que los botones de diálogo de alerta no obedecen al Widget.Button aún no está probada desde mi punto de vista.

Conclusión consolidada: La capacidad de estilo de los diálogos de alerta independientemente de otros widgets es limitada en Android, pero cada vez más potente a medida que las nuevas versiones mejoran en este aspecto.

1

Puede anular "buttonBarButtonStyle" en lugar de "buttonStyle" de esta manera:

<style name="dialogAlertTheme" parent="@android:style/Theme.Dialog.Alert"> 
    <item name="android:buttonBarButtonStyle">@style/customButtonStyle</item> 
</style> 
+0

requiere API 11 o superior – Yar

+0

como si alguien todavía se desarrolla para api 10 y más bajo ... –

+1

@TimCastelijns Siento que no viene al caso. Una respuesta de calidad debe proporcionar esa información. Y de hecho hay casos en que la gente tiene que mantener aplicaciones compatibles con versiones anteriores. –

1

hice un método como este que va a cambiar los colores de los botones por defecto y el fondo

public static void setDefaultColorTextForDialogButton(AlertDialog alertDialog, Resources r) { 
    Button b; 

    b= alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE); 
    if(b != null) { 
     b.setTextColor(r.getColor(R.color.default_text)); 
     b.setBackgroundColor(Color.WHITE); 
    } 
    b = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE); 
    if(b != null) { 
     b.setTextColor(r.getColor(R.color.default_text)); 
     b.setBackgroundColor(Color.WHITE); 
    } 
    b = alertDialog.getButton(DialogInterface.BUTTON_NEUTRAL); 
    if(b != null) { 
     b.setTextColor(r.getColor(R.color.default_text)); 
     b.setBackgroundColor(Color.WHITE); 
    } 
} 

Esto podría ser útil para algunas personas!

+1

En un lenguaje OO como Java, esta no es la forma preferida de hacer las cosas, especialmente si se tiene en cuenta el mantenimiento. –

4

Prueba esto:

<item name="buttonBarStyle">@style/Widget.AppCompat.ButtonBar</item> 
    <item name="buttonBarButtonStyle">@style/AppTheme.Button</item> 
    <item name="buttonBarPositiveButtonStyle">@style/YoursTheme</item> 
    <item name="buttonBarNegativeButtonStyle">@style/YoursTheme</item> 
    <item name="buttonBarNeutralButtonStyle">@style/YoursTheme</item> 
+1

Esto sería más útil si explicara dónde deben colocarse estas líneas. Seguro que no lo puedo entender ... – RenniePet

+0

¡Gracias por eso, lo estaba buscando por horas! @RenniePet debes colocarlo en tu tema Dialog, un tema que probablemente debería extender 'ThemeOverlay.AppCompat.Dialog.Alert' y que declaras en tu tema usando @ style/YourDialogTheme Benoit

Cuestiones relacionadas