定制的警报对话框在Android 4.x上显示异常

9

我想在我的Android应用程序中自定义警报对话框,因此我首先更改了我的应用程序主题的alertDialogTheme属性,如下所示:

res/values/themes.xml

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="android:alertDialogTheme">@style/AlertDialogTheme</item>
    </style>

    <style name="AlertDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert"/>
</resources>

仅仅通过这样做,我并没有期望对话框会与标准的外观有所不同,因为新的主题AlertDialogTheme与其父主题完全相同。在Android Lollipop上它可以正常工作,但是在Android Kitkat上对话框后面会出现一个白色矩形。以下是它的外观:

enter image description here

我做错了什么吗?也许使用了错误的父元素?

谢谢!


只需将背景设置为透明即可。 - zgc7009
1
为什么不使用AppCompat库和AlertDialogCompat一起使用呢? - Joaquin Iurchuk
1
不!一点也不!我是指官方的Android支持库 - Joaquin Iurchuk
@joaquin 当然!我已经在使用AppCompat库了。但是我导入的是android.app.AlertDialog而不是android.support.v7.app.AlertDialog。现在它运行得非常好。谢谢! - Milack27
好的。我应该将其写成答案以标记此问题已解决吗? - Joaquin Iurchuk
显示剩余3条评论
4个回答

18
这是因为您使用了 AlertDialog,而不是相对较新的 AlertDialogCompat。后者在所有平台上提供了相同的 Material Design 样式对话框,并且强烈建议使用。
要使用它,您必须确保在 Gradle 文件中包含以下行作为依赖关系:

com.android.support:appcompat-v7:24.2.1
(这是最新版本,请通过查看 SDK 管理器来确保更新所有软件包)。
然后,在您想要显示对话框的 Activity 中,您必须导入 android.support.v7.app.AlertDialog 并像以前一样使用 AlertDialog.Builder。

我认为这个问题已经得到了解答,尽管还有其他问题出现。使用AlertDialog支持类进行自定义时,由于像topDark这样的颜色属性不再生效,因此自定义受到了限制,无论是放在alertDialogTheme中还是alertDialogStyle中。而且,同样的解决方案不能应用于DatePickerDialog和TimePickerDialog,因为这些类目前还没有它们的支持版本。 - Milack27
对于这些情况,您应该继续使用每个API中包含的默认日期和时间选择器,或者使用一些非官方的向后端口 - Joaquin Iurchuk
非官方的端口可能会起作用,我从未尝试过。但是默认的端口也会有同样的问题。 - Milack27
有没有关于如何在KitKat中实现DateTimePicker对话框相同效果的建议? - Califf
@Califf 在 GitHub 上寻找一些 TimePicker Dialog 的后备方案。 - Joaquin Iurchuk
当我导入android.support.v7.app.AlertDialog而不是import android.app.AlertDialog时,背景消失了,但现在标题出现在蓝色边框下面而不是上面。 - has19

2
我通过使用以下代码解决了这个问题:
 <style name="CustomAppCompatAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="android:windowBackground">@android:color/transparent</item>
</style>

这就是zgc7009在第一条评论中建议的。 如果我为每个API定义两个XML样式,它可以工作。 如果不这样做,在Android Lollipop上对话框将看起来很奇怪。 我认为Joaquin的解决方案要简单得多。 - Milack27

1

如果您正在使用 AndroidX,您需要使用以下导入:

import androidx.appcompat.app.AlertDialog

0
  1. 在您的构建脚本中添加 appcompat 依赖项:

    implementation 'com.android.support:appcompat-v7:27.1.1'

  2. 将所有使用 android.app.AlertDialog 的地方替换为 android.support.v7.app.AlertDialog


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