如何更改Android警报对话框的背景?

我在我的应用程序中使用AlertDialog类。 默认情况下,这些警报对话框具有透明背景。 我试图使用不透明的背景,而非常失败。 这些是我的风格:

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

我对整个活动(窗口背景更改为“my_background”)成功应用了“MyOpaqueActivity”风格,但在这些活动中不适用于警报对话框。 “alertDialogStyle”属性和我的“MyOpaqueAlertDialog”风格似乎没有任何影响。

那么如何更改这些警报对话框的背景呢?

你的方法是行不通的。 看起来AlertDialog(和生成器)硬编码的主题,并不尊重alertDialogStyle任何地方:

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

他们在这里得出了同样的结论。

从AlertDialog派生的调用受保护的构造函数AlertDialog(context,R.style.MyOpaqueAlertDialog)的自定义对话框类将是一个解决方法。

在最新的android源代码中,AlertDialog.Builder有一个新的公共构造函数,它带有一个主题参数。 不幸的是,它还没有发布(也许在姜饼?)。

一旦你发现AlertDialogs有一些特殊的属性,用XML风格很容易做到这一点。

但是,知道您所指的是哪个Android版本(或针对​​的目标)会很有趣。 据我所知,Theme.Dialog是比较新的。 在较旧的版本使用它们的情况下,较新的Android版本也不使用AlertDialogs。

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

较新的Android版本也有AlertDialog风格的android:progressLayout和android:horizo​​ntalProgressLayout属性。

此外,在较新的Android版本中,可以通过在自定义主题中使用alertDialogTheme而不是alertDialogStyle来引用AlertDialog主题。 AlertDDialogThemes支持更多的熟悉和更强大的属性,如windowBackground,windowTitleStyle等。看看styles.xml和themes.xml。

不幸的是,当超级差的时候,哪些function的文档被添加了。 请找出自己的方法是最适合你的。

从文档看起来像你可以在onCreateDialog中做到这一点。

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

只有其他解决scheme是使用该主题的自定义对话框。