AlertDialogs中的button样式

有谁知道如何覆盖AlertDialogbutton的默认样式? 我已经浏览了Android源代码的主题和样式,并尝试了不同的东西,但是我一直无法find一个可行的方法。

我在下面得到了改变背景的工作,但是没有对button做任何事情。 myTheme通过清单应用于整个<application> 。 (为了清楚起见,其他一些项目被删除,但它们只与标题栏有关。)

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

有任何想法吗?

Solutions Collecting From Web of "AlertDialogs中的button样式"

我想你必须实现你自己的Dialog类。

鉴于斯诺弗莱克先生的推理是不准确的,我正在自由地提供另一个答案。

在Steve Haley的问题中, 标记存在一些问题,并且它正在调用alertDialogStyle和alertDialogTheme,这很可能是因为alertDialogTheme在alertDialogStyle过了很久之后才引入的事实。

所以,即使你的Andoid平台上有@android:style / Theme.Dialog.Alert,你仍然不能利用它的expression能力,把一个被称为版本的版本挂回自己的主题,除非你的Android平台支持android:alertDialogTheme属性/项目的主题。 (这种不一致的Android版本可能存在也可能不存在,我不知道,但问题中使用的标记暗示了它的确存在)。

在问题的标记中,parent =“@ android:style / Theme.Dialog.Alert”除了创build自定义警报对话框主题的错觉之外什么不会做,除非您只是自定义警报对话框样式。

这就是标记的样子。 并非所有Android版本都支持所有function。

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

自定义警报对话框风格已经有相当长的一段时间了,但仅限于提供(fullDark),“topDark”等(背景)drawables。

自定义警报对话框主题打开了一个方法来提供属性,如windowBackground,windowTitleStyle等,但如前所述,您需要一个支持alertDialogThem属性/项目为主题的Android版本。 我无法弄清楚这是什么时候推出的,但它并不是Android 2.2,Eclipse会告诉你…

我没有资源去validationMrSnowflake的结论,即不可能用XML格式化对话框button,但是除非我们遇到了Android中那些function真正缺失的那些令人讨厌的方面,否则我觉得这是不太可能的。

事实上,这个问题中最缺乏的是这方面最相关的部分

 <style name="customButtonStyle" /> 

因此,警告对话框button不服从Widget.Button的结论还没有从我的观点来certificate。

综合结论: 独立于其他小部件的独立于其他小部件的对话框样式的能力在Android中是有限的,但是随着新版本在这方面的改进,它们变得越来越强大。

尝试这个:

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

你可以覆盖“buttonBarButtonStyle”而不是“buttonStyle”,如下所示:

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

我做了这样的方法,将改变默认的button颜色和背景

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

这可能对某些人有用!