将 AppCompat 主题应用于 PreferenceFragment 中的个人首选项

2024-02-05

我一直在努力争取我的PreferenceFragment与我的应用程序的其余部分具有相同的基于材质的主题和样式(通过 AppCompat)。这PreferenceFragment我用来管理所有应用程序设置的工具如下所示:

正如您从上面的屏幕截图中看到的,我能够自定义PreferenceFragment通过使用colorAccent, colorPrimary,以及一些其他属性。我的主题为PreferenceFragment如下:

<style
    name="settingsTheme"
    parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimary">@color/blue_grey_500</item>
    <item name="colorAccent">@color/blue_grey_500</item>
    <item name="android:textColor">@color/black_text_alt</item>
    <item name="android:textColorSecondary">@color/black_secondary_text</item>
</style>

然而,尽管我尽了最大努力,我还是无法将主题应用到我的作品中的各个元素上。PreferenceFragment, 例如ListPreference and EditTextPreference;所有首选项仍然保留标准 AppCompat 主题:

我发现一篇 2 年前的帖子讨论了这个问题,尽管没有真正的解决方案:如何将主题应用到 的 元素 https://stackoverflow.com/questions/10228482/how-to-apply-theme-to-preferencescreen-elements-of-a-preferencecategory

我想知道自从 AppComat V21 发布以来是否有人能够成功地将主题应用到首选项。如果没有,是否有任何可行的解决方法可用于将自定义主题应用于个人偏好?


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(不要与其本机对应物混淆)用于创建其实例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 AppCompat 主题应用于 PreferenceFragment 中的个人首选项 的相关文章

随机推荐

  • 跨嵌套列表 rbind 数据帧

    我查看了各种绑定列表问题 例如this https stackoverflow com questions 1652522 rbind dataframes in a list of lists但我真的找不到更有效的方法来做到这一点 我有一
  • Kotlin:无法调用表达式,因为找不到函数 invoke()

    我正在尝试构建一个应用程序来实现谷歌地图 由于某种原因 我收到由于找不到函数 invoke 而无法调用表达式的错误 我不知道如何解决这个问题 也许你们中的一个人可以帮忙 package com example maxs kotlinnear
  • 如何让 Google Now 在 Android 后台持续运行

    我心里有一个应用程序的想法 但我还没有弄清楚其中的一部分 在 Android 版 Google Now 中 它为您提供以下搜索选项 输入搜索 点击麦克风说出您的搜索 或者只需说 Google 即可开始语音搜索 我想知道他们是如何让 3 发挥
  • 获取 Yii 中最后插入的值

    我已经制作了一个表单模型 其中的字段就像 id firstname lastname description created at updated at created by updated by 我已经为表单做了必要的 CRUD 现在我想
  • JMeter 基本身份验证

    我试图暗示使用 JMeter 的 Web 服务的基本身份验证过程 但每次它都会抛出错误 401 Unauthorized 我尝试使用 HTTP 标头管理器向其添加标头授权和值 但它仍然不起作用 我还尝试过使用 HTTP 授权管理器 还是没有
  • 将组合框值传递到 MS Access 中的 SQL 查询

    我的表单中有一个组合框 我希望将组合框的文本传递到查询中 我的查询是 select from where something Forms Enter Data comboCup 表格的名称是Enter Data组合框的名称是comboCup
  • python中[None]和[]有什么区别? [复制]

    这个问题在这里已经有答案了 我认为 None 与 相同 但在我的测试中 也许有一些东西 gt gt gt print len 0 gt gt gt print len None 1 我什么时候应该使用 None 和 另一个有趣的问题 gt
  • Visual Studio 2013.3 中新的 MVC5 项目出现错误

    想知道其他人是否经历过这种情况以及他们的解决方案是什么 在 Visual Studio 2013 中 我创建一个新的 ASP NET Web 应用程序 保留所有默认值 在下一个屏幕中 我选择 MVC 添加 MVC 的文件夹和核心引用 但不添
  • Scrum - 您何时估计产品待办事项的工作量? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 您的团队在 Scrum 流程的哪一部分对完成给定产品积压项目所需的工作量进行了有根据的估计 例如 假设您有一个产品待办事项列表项 内容为 Sprint
  • xCode 中存在重复符号,但不存在重复符号

    问题Xcode 版本 4 6 1 4H512 抱怨重复符号问题 重复符号 OBJC METACLASS PacksStoreHelper 位于 Users shannoga Library Developer Xcode DerivedDa
  • 如何在 flutter 中使用展示案例视图?

    I use 展示案例查看 https github com simformsolutions flutter showcaseview打包在我的应用程序中 并想展示一次 就在第一次启动之后 我怎样才能只执行一次而不在下次启动时显示它 ove
  • MapViewOfFile 返回什么? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么加载程序无法加载到所需位置 https stackoverflow com questions 9698496 why wont the loader load at the desired l
  • 为什么当列包含空字符串时bcp输出null,当列包含空字符串时bcp输出空字符串?

    这让我觉得非常奇怪的行为 在发现这个之前我花了一段时间检查代码中的错误 out 从数据库表或视图复制到文件 如果指定现有文件 则该文件将被覆盖 提取数据时 请注意 bcp 实用程序将空字符串表示为 null 将 null 字符串表示为空字符
  • Excel 搜索包含子字符串的多行

    我有一个包含 2 张纸的 Excel 文件 第一个获得了列中的关键字列表 第二个在一个列上有句子 在另一列上有一个 id 因此 这两张纸看起来像这样 Sheet 1 Sheet 2 A A B the 15587 The cat is wa
  • Gomock无法使用类型map[string]*mockFoo作为map[string]foo

    我正在使用 gomock 并且我有一段希望测试的示例代码 type StructA struct client map string Foo type Foo interface foo methodFoo string func a st
  • 如何从 S3 存储桶中递归删除文件

    我在 S3 中有以下文件夹结构 有没有办法递归删除某个文件夹下的所有文件 比如foo bar1 or foo or foo bar2 1 foo bar1 1 foo bar1 2 foo bar1 3 foo bar2 1 foo bar
  • OnsenUi Angular 和登录

    我正在尝试使用 onsen cordova 开发移动应用程序 我需要的是 当应用程序启动时 它会加载login html页面 如果应用程序检测到用户已登录 则会重定向到 home html 对于每个 受保护的页面 我想调用一个检测用户是否已
  • Mac 版 Java 中的文件输入

    我们现在正在编程课上学习文件输入和输出 但我有一台 Macbook Pro 我了解如何执行此操作 并且可以在 Windows 上执行此操作 但我无法找到如何在 Mac 上执行此操作 我只是似乎不知道在 File Fred new File
  • 如何从 Java 调用 .NET 代码?

    我并不是在寻找像网络服务这样的常见答案 我正在寻找在同一台机器上运行的轻型解决方案 编辑 我正在寻找 Java 中调用 NET 方法的方法 我是作者jni4net http jni4net sf net JVM和CLR之间的开源进程间桥梁
  • 将 AppCompat 主题应用于 PreferenceFragment 中的个人首选项

    我一直在努力争取我的PreferenceFragment与我的应用程序的其余部分具有相同的基于材质的主题和样式 通过 AppCompat 这PreferenceFragment我用来管理所有应用程序设置的工具如下所示 正如您从上面的屏幕截图