如何更改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:horizontalProgressLayout属性。
此外,在较新的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是使用该主题的自定义对话框。