Android12 Settings系列(一)二级设置界面中自定义Fragment使用一级菜单中的图标显示异常

server/2024/10/21 0:52:25/

一、前言

这个问题的出现是因为一个需求。笔者接到一个对settings菜单分类管控的需求,就不得不根据已有的需求添加新的界面。
于是笔者对原有的设置进行了如下的修改。
1、在settings中的顶级菜单(一级菜单)中增加一项(图标+文字)。
2、新建Fragment
3、将一些原生Settings中的preference移动到自己定义的fragment的xml中
4、增加跳转逻辑

在做了这些修改之后编译apk看实际效果的时候发现了一个问题,那就是自己创建的fragment 中xml里把原生的preference移植过来图标显示竟然有问题了。

二、问题分析

看了很多一级设置项的代码,发现Android12 之后settings中的图标变成了矢量图,通过着色来给图标上色。于是看了一下
vendor\mediatek\proprietary\packages\apps\MtkSettings\src\com\android\settings\homepage\TopLevelSettings.java

    @Overridepublic void onCreatePreferences(Bundle savedInstanceState, String rootKey) {super.onCreatePreferences(savedInstanceState, rootKey);final PreferenceScreen screen = getPreferenceScreen();if (screen == null) {return;}// Tint the homepage iconsfinal int tintColor = Utils.getHomepageIconColor(getContext());final int count = screen.getPreferenceCount();for (int i = 0; i < count; i++) {final Preference preference = screen.getPreference(i);if (preference == null) {break;}final Drawable icon = preference.getIcon();if (icon != null) {icon.setTint(tintColor);}}}

看到上述代码,终于知道了玄机,在创建settings的 preference时,会遍历preference和中间的icon,icon不为空时,获取settings的homepage 的color 调用 settint 给图标着色。之前的问题就是没有重写onCreatePreferences方法,导致矢量图默认成了白色,看不清楚

三、问题解决

在新增加的fragment界面,重写onCreatePreferences,添加如下代码

    @Overridepublic void onCreatePreferences(Bundle savedInstanceState, String rootKey) {super.onCreatePreferences(savedInstanceState, rootKey);final PreferenceScreen screen = getPreferenceScreen();if (screen == null) {return;}// Tint the homepage iconsfinal int tintColor = Utils.getHomepageIconColor(getContext());final int count = screen.getPreferenceCount();for (int i = 0; i < count; i++) {final Preference preference = screen.getPreference(i);if (preference == null) {break;}final Drawable icon = preference.getIcon();if (icon != null) {icon.setTint(tintColor);}}}

http://www.ppmy.cn/server/133498.html

相关文章

1.2.3 TCP IP模型

TCP/IP模型&#xff08;接网叔用&#xff09; 网络接口层 网络层 传输层 应用层 理念&#xff1a;如果某些应用需要“数据格式转换”“会话管理功能”&#xff0c;就交给应用层的特定协议去实现 tip&#xff1a;数据 局部正确不等于全局正确 但是&#xff0c;数据的 全局正…

Element-ui官方示例(Popover 弹出框)

Element-ui官方示例&#xff08;Popover 弹出框&#xff09;&#xff0c;好用的弹出框。 使用 vue-cli3 我们为新版的 vue-cli 准备了相应的​Element 插件​&#xff0c;你可以用它们快速地搭建一个基于 Element 的项目。 使用 Starter Kit 我们提供了通用的项目模版&#…

期货外盘行情源7个市场CTP推送式服务说明

在期货交易领域&#xff0c;及时、准确的市场行情信息是投资者做出决策的重要依据。为了满足广大期货投资者对国际期货市场信息的迫切需求&#xff0c;我们特别推出了“期货外盘行情源2千每月7个市场CTP推送式”服务。本服务旨在通过高效、稳定的技术手段&#xff0c;为投资者提…

第二章 数据结构

826. 单链表 使用数组模拟链表&#xff0c;因为采用结构体new的方式比较慢&#xff0c;笔试中一般不使用。单链表的用途是邻接表&#xff0c;邻接表的应用场景是存储树和图。 每一个结点存储val&#xff08;结点值&#xff09;以及next&#xff08;指针&#xff0c;指向下个节…

LeetCode-3192 使二进制数组全部等于1的最少操作次数Ⅱ

今天的每日一题就是昨天的延伸&#xff0c;预判成功。 LeetCode-3191 使二进制数组全部等于1的最少操作次数-CSDN博客文章浏览阅读115次。如果数组第一个元素就是0&#xff0c;那么第一个元素是肯定要翻转的&#xff0c;而我们只有从索引0的位置开始翻转才可以翻转到第一个元素…

【Windows】【DevOps】Windows Server 2022 采用WinSW将一个控制台应用程序作为服务启动(方便)

下载WinSW 项目地址&#xff1a; GitHub - winsw/winsw: A wrapper executable that can run any executable as a Windows service, in a permissive license. 下载地址&#xff1a; https://github.com/winsw/winsw/releases/download/v2.12.0/WinSW-x64.exe 参考配置模…

fluent-ffmpeg操作MP3文件深入解析

软考鸭微信小程序 学软考,来软考鸭! 提供软考免费软考讲解视频、题库、软考试题、软考模考、软考查分、软考咨询等服务 引言 fluent-ffmpeg是一个功能强大的Node.js库&#xff0c;它为FFmpeg提供了一个流畅的接口。FFmpeg是一个著名的多媒体框架&#xff0c;以处理音频、视频和…

Oracle中解决select into值集为空的报错情况

先看为空的情况 procedure test is n number; begin select 1 into n from CUX_2_OM_RELEASE_LIMIT_V cov where cov.Customer_Idnull; end; CUX_2_OM_RELEASE_LIMIT_V中没有id是空的&#xff0c;因此返回的结果一定是空集 运行结果: 有时候我…