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

19

在我的应用程序中,我使用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>

我已经成功地为所有活动应用了“MyOpaqueActivity”样式(窗口背景色更改为“my_background”),但在这些活动中的警报对话框中,它不起作用。 "alertDialogStyle" 属性和我的 "MyOpaqueAlertDialog" 样式似乎没有任何效果。

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

3个回答

11

你的方法行不通。看起来AlertDialog(和Builder)硬编码了主题,并且没有在任何地方使用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,它接受一个主题参数。不幸的是,它还没有发布(也许在Gingerbread中?)。


1
你能详细阐述一下你的答案吗,因为它不准确。首先,你提到的问题并没有讨论警报对话框背景的问题;那里只是关于按钮的问题。其次,主题的名称被硬编码并不意味着主题不能被定制化。 - class stacker

4

一旦你发现AlertDialog有一些特殊的属性,使用XML样式很容易实现这个功能。

然而,了解你所指的Android版本(或目标版本)是很有趣的。据我所知,Theme.Dialog相对较新。在一些老版本中使用AlertDialogs的情况下,新版本的Android不会使用它们。

这对我来说在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:horizontalProgressLayout属性。此外,在较新的Android版本中,可以使用alertDialogTheme而不是alertDialogStyle在自定义主题中引用AlertDialog主题。AlertDDialogThemes支持更熟悉和更强大的属性,如windowBackground、windowTitleStyle等。请查看styles.xml和themes.xml。不幸的是,关于哪个功能是何时添加的文档非常少。请自行找出最适合您的方法。

3
文档来看,您可以在onCreateDialog中完成此操作。
FrameLayout fl = (FrameLayout) findViewById(android.R.id.custom);
fl.setBackgroundResource(); // has to be a drawable.

唯一的其他解决方案是使用该主题创建自定义对话框。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接