UPDATE:我创建了一个库来解决这个问题(使用 AppCompat r22):https://github.com/consp1racy/android-support-preference https://github.com/consp1racy/android-support-preference
The ListPreference
延伸DialogPreference
它使用这段代码来创建对话框:
mBuilder = new AlertDialog.Builder(context)
.setTitle(mDialogTitle)
.setIcon(mDialogIcon)
.setPositiveButton(mPositiveButtonText, this)
.setNegativeButton(mNegativeButtonText, this);
正如你所看到的AlertDialog.Builder
构造函数未提供第二个可选值int theme
范围。这意味着对话框将以您的活动主题中的任何内容为主题android:alertDialogTheme
属性。
现在您必须为您的对话框创建一个自定义主题,该主题源自Theme.AppCompat.Dialog
像这样:
<style name="Theme.YourApp.Dialog.Alert" parent="Theme.AppCompat.Light.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item>
<item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>
<item name="colorAccent">@color/accent_yourapp</item>
<item name="colorPrimary">@color/primary_yourapp</item>
<item name="colorPrimaryDark">@color/primary_dark_yourapp</item>
</style>
问题一:上述解决方案不适用于RingtonePreference
因为它不延伸ListPreference
但调用铃声选择器意图,因此它始终根据系统进行主题化。看看这个答案:铃声偏好主题 https://stackoverflow.com/questions/16589467/ringtonepreference-theme所以我们可以将其标记为已解决。
问题2:AppCompat 对话框缺少标题。到目前为止我还没有找到解决这个问题的方法。确实,我看起来还不够努力。让我们忽略标题缺失这个小问题。
问题3:单选按钮可绘制对象不会发生突变,因此被动和主动(彩色)状态之间的图形不一致 - 所有都是彩色的(不仅仅是您按下的那个)或全部是灰色的。现在这真的很烦人
问题 2 和 3 迫使我采取另一条路线 - 我的对话框主题在 API 14+ 上看起来像这样
<style name="Theme.MyApp.Dialog.Alert" parent="android:Theme.DeviceDefault.Light.Dialog.MinWidth">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
</style>
在 API 21+ 上就像这样
<style name="Theme.YourApp.Dialog.Alert" parent="android:Theme.DeviceDefault.Light.Dialog.MinWidth">
<item name="android:colorPrimary">@color/primary_yourapp</item>
<item name="android:colorPrimaryDark">@color/primary_dark_yourapp</item>
<item name="android:colorAccent">@color/accent_yourapp</item>
</style>
这些值是通过爬取平台源文件实验获得的,并经过充分测试。
关键是唯一可靠的解决方案似乎是使用设备默认对话框主题。 Lollipop 之前唯一的选择是浅色或深色变体。在 Lollipop 上,这将按预期和要求工作。
EDIT:从 appcompat-v7-r21.1.0 开始,您可以使用AppCompatDialog https://developer.android.com/reference/android/support/v7/app/AppCompatDialog.html这是原生的物质主题变体AlertDialog
.
您可以使用提供的AlertDialog.Builder https://developer.android.com/reference/android/support/v7/app/AlertDialog.Builder.html(不要与其本机对应物混淆)用于创建其实例。