当前位置: 首页 > news >正文

android 12 添加菜单

1.创建一级菜单

packages\apps\Settings\res\xml\top_level_settings.xml

<com.android.settings.widget.HomepagePreferenceandroid:fragment="com.android.settings.DeviceStatusSettings"android:icon="@drawable/ic_settings_display_white"android:key="top_level_device_status"android:order="-80"android:title="@string/device_status_settings"android:summary="@string/device_status_dashboard_summary"settings:controller="com.android.settings.devicestatus.TopLevelDeviceStatusPreferenceController"/>

DeviceStatusSettings 

@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
public class DeviceStatusSettings extends DashboardFragment {private static final String TAG = "DeviceStatusSettings";private static final String KET_SPK_MODE_SETTINGS = "spk_mode_settings";@Overridepublic int getMetricsCategory() {return SettingsEnums.DISPLAY;}@Overrideprotected String getLogTag() {return TAG;}@Overrideprotected int getPreferenceScreenResId() {return R.xml.device_status_setting;}@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);}@Overrideprotected List<AbstractPreferenceController> createPreferenceControllers(Context context) {return buildPreferenceControllers(context, getSettingsLifecycle());}@Overridepublic int getHelpResource() {return R.string.help_uri_display;}private static List<AbstractPreferenceController> buildPreferenceControllers(Context context, Lifecycle lifecycle) {final List<AbstractPreferenceController> controllers = new ArrayList<>();controllers.add(new SpkModePreferenceController(context, KET_SPK_MODE_SETTINGS));return controllers;}public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =new BaseSearchIndexProvider(R.xml.device_status_setting) {@Overridepublic List<AbstractPreferenceController> createPreferenceControllers(Context context) {return buildPreferenceControllers(context, null);}};
}

TopLevelDeviceStatusPreferenceController

public class TopLevelDeviceStatusPreferenceController extends BasePreferenceController {public TopLevelDeviceStatusPreferenceController(Context context, String preferenceKey) {super(context, preferenceKey);}@Overridepublic int getAvailabilityStatus() {return AVAILABLE;}
}

 2.创建二级菜单

<PreferenceScreenxmlns:android="http://schemas.android.com/apk/res/android"xmlns:settings="http://schemas.android.com/apk/res-auto"android:key="display_settings_screen"android:title="@string/device_status_settings"settings:keywords="@string/keywords_display"><PreferenceCategoryandroid:title="@string/device_spk_mode"><com.android.settingslib.RestrictedPreferenceandroid:key="device_spk_mode"android:title="@string/device_spk_mode"android:summary="@string/summary_placeholder"android:fragment="com.android.settings.devicestatus.SpkModeSettings"settings:controller="com.android.settings.devicestatus.SpkModePreferenceController"/></PreferenceCategory>
</PreferenceScreen>

SpkModeSettings 

public class SpkModeSettings extends RadioButtonPickerFragment {private static final String TAG = "SpkModeSettings";public static final int FALLBACK_VALUE = 0;private static final String SPK_MODE_BROADCAST = "android.intent.action.SPK_MODE";private static final String SPK_MODE_PERSIST = "persist.realbom.spkmode";@Overridepublic void onAttach(Context context) {super.onAttach(context);}@Overrideprotected List<? extends CandidateInfo> getCandidates() {final String[] entries = entries();final String[] values = keys();final List<SpkModeControlCandidateInfo> candidates = new ArrayList<>();if (entries == null || entries.length <= 0) return null;if (values == null || values.length != entries.length) {throw new IllegalArgumentException("Entries and values must be of the same length.");}for (int i = 0; i < entries.length; i++) {candidates.add(new SpkModeControlCandidateInfo(entries[i], values[i]));}return candidates;}private String[] entries() {return getResources().getStringArray(R.array.spk_mode_entries);}private String[] keys() {return getResources().getStringArray(R.array.spk_mode_values);}@Overrideprotected String getDefaultKey() {return getCurrentSkpModeValue(getContext());}@Overrideprotected boolean setDefaultKey(String key) {setCurrentSkpModeValue(getContext(), key);return true;}@Overrideprotected int getPreferenceScreenResId() {return R.xml.spk_mode;}@Overridepublic int getMetricsCategory() {return 1;}private String getCurrentSkpModeValue(Context context) {if (context == null) {return Long.toString(FALLBACK_VALUE);} else {return SystemProperties.get(SPK_MODE_PERSIST, "0");}}private void setCurrentSkpModeValue(Context context, String key) {try {if (context != null) {Log.d(TAG,"set current value ==  "+key);int value = Integer.parseInt((String) key);SystemProperties.set(SPK_MODE_PERSIST, String.valueOf(value));//Settings.System.putInt(context.getContentResolver(), SPK_MODE, value);setSkpModeValue(context,value);}} catch (NumberFormatException e) {Log.e(TAG, "could not persist screen timeout setting", e);}}@Overrideprotected void onSelectionPerformed(boolean success) {super.onSelectionPerformed(success);//getActivity().finish();}private final class SpkModeControlCandidateInfo extends CandidateInfo {private final String name;private final String key;SpkModeControlCandidateInfo(String title, String value) {super(true);name = title;key = value;}@Overridepublic CharSequence loadLabel() {return name;}@Overridepublic Drawable loadIcon() {return null;}@Overridepublic String getKey() {return key;}}private void setSkpModeValue(Context context, int value){Intent intent = new Intent();intent.setAction(SPK_MODE_BROADCAST);//intent.putExtra("com",4);intent.putExtra("value",value);context.sendBroadcast(intent);}}

SpkModePreferenceController 

public class SpkModePreferenceController extends BasePreferenceController {public static String PREF_NAME = "spk_mode";public static String TAG = "SpkModePreferenceController";public static final int FALLBACK_VALUE = 0;private final CharSequence[] mEntries;private final CharSequence[] mValues;private static final String SPK_MODE_BROADCAST = "android.intent.action.SPK_MODE";private static final String SPK_MODE_PERSIST = "persist.realbom.spkmode";public SpkModePreferenceController(Context context, String key) {super(context, key);mEntries = context.getResources().getStringArray(R.array.spk_mode_entries);mValues = context.getResources().getStringArray(R.array.spk_mode_values);}@Overridepublic int getAvailabilityStatus() {return AVAILABLE;}@Overridepublic void updateState(Preference preference) {final long curValue = Long.valueOf(SystemProperties.get(SPK_MODE_PERSIST,"0"));updatePreferenceDescription(preference, curValue);Log.d(TAG, "updateState currentValue= "+String.valueOf(curValue));}public static CharSequence getDescription(long curValue, CharSequence[] entries, CharSequence[] values) {if (curValue < 0 || entries == null || values == null || values.length != entries.length) {return null;}for (int i = 0; i < values.length; i++) {long temp = Long.parseLong(values[i].toString());if (curValue == temp) {Log.d(TAG,"Description entries == "+entries[i]);return entries[i];}}return null;}private void updatePreferenceDescription(Preference preference,long curValue) {final CharSequence summary;summary = getDescription(curValue, mEntries, mValues);preference.setSummary(summary);} 
}

 

<PreferenceScreenxmlns:android="http://schemas.android.com/apk/res/android"android:title="@string/device_spk_mode"/>

 

 

相关文章:

android 12 添加菜单

1.创建一级菜单 packages\apps\Settings\res\xml\top_level_settings.xml <com.android.settings.widget.HomepagePreferenceandroid:fragment"com.android.settings.DeviceStatusSettings"android:icon"drawable/ic_settings_display_white"android:…...

Map 的 5 种遍历方式

Map 的 5 种遍历方式 强烈推荐 for-each entrySet()遍历 和 lambda 表达式遍历 &#xff0c;简洁又好用&#xff01;&#xff01;&#xff01; package com.maptest; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set;pub…...

Linux的基本指令 ( 一 )

目录 前言 Linux基本指令 快速认识五个指令 ls指令 补充内容 pwd指令 补充内容 cd指令 补充内容 重新认识指令 指令的本质 which指令 alias指令 最后 一个文件的三种时间 tree指令及安装 tree指令 前言 关于Linux操作系统的桌面&#xff0c;在学校教学中我们…...

【深度学习】学习率及多种选择策略

学习率是最影响性能的超参数之一&#xff0c;如果我们只能调整一个超参数&#xff0c;那么最好的选择就是它。相比于其它超参数学习率以一种更加复杂的方式控制着模型的有效容量&#xff0c;当学习率最优时&#xff0c;模型的有效容量最大。本文从手动选择学习率到使用预热机制…...

具有“真实触感”的动捕数据手套mhand pro,提供更精确的动作捕捉

随着人工智能的普及和万物互联&#xff0c;vr虚拟技术备受关注&#xff0c;为了更加真实的虚拟现实交互体验&#xff0c;动捕数据手套的使用逐渐普及&#xff0c;vr手套可以实时采集各手指关节运动数据&#xff0c;使用动捕数据手套可以在虚拟现实的场景中实现对真实手部运动的…...

Mongodb使用killCursors停止运行的cursor

cursor指向查询结果的游标&#xff0c;通过游标向下移动&#xff0c;获得下一条查询结果。MongoDB分批向用户返回数据结果。通过游标的移动&#xff0c; mongodb确定当前返回结果的位置&#xff0c;是否要加载更多数据到内存当中。cursor有默认的超时时间&#xff0c; 超时后cu…...

电脑风扇转一下停一下,无法正常开机问题解决

今天同事电话说电脑开不了机了&#xff0c;只听见风扇不停地呜呜地作响。笔者第一反应是不是硬件哪里出问题了&#xff0c;于是二话没说拿起心爱的螺丝刀就闪了过去。 按下电源&#xff0c;确实如电话所述。但感觉风扇并非一直在转&#xff0c;而是时断时续。由于听不大真切&a…...

无需部署服务器,如何结合内网穿透实现公网访问导航页工具Dashy

文章目录 简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问 简介 Dashy 是一个开源的自托管的导航页配置服务&#xff0c;具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你可以将自己常用的一些网站聚合起来放在一起&#xff0c;形成自己的导航…...

Go GORM简介

GORM&#xff08;Go Object-Relational Mapping&#xff09;是一个用于Go语言的ORM库&#xff0c;它提供了一种简单、优雅的方式来操作数据库。GORM支持多种数据库&#xff0c;包括MySQL、PostgreSQL、SQLite和SQL Server。以下是GORM的一些主要特性 全功能ORM&#xff1a;GORM…...

前端量子纠缠 效果炸裂 multipleWindow3dScene

我 | 在这里 &#x1f575;️ 读书 | 长沙 ⭐软件工程 ⭐ 本科 &#x1f3e0; 工作 | 广州 ⭐ Java 全栈开发&#xff08;软件工程师&#xff09; &#x1f383; 爱好 | 研究技术、旅游、阅读、运动、喜欢流行歌曲 ✈️已经旅游的地点 | 新疆-乌鲁木齐、新疆-吐鲁番、广东-广州…...

第十七章 处理空字符串和 Null 值 - XMLIGNORENULL、XMLNIL 和 XMLUSEMPTYELEMENT 的详细信息

文章目录 第十七章 处理空字符串和 Null 值 - XMLIGNORENULL、XMLNIL 和 XMLUSEMPTYELEMENT 的详细信息XMLIGNORENULL、XMLNIL 和 XMLUSEMPTYELEMENT 的详细信息XMLIGNORENULLXMLNILXMLUSEEMPTYELEMENT 导入值 第十七章 处理空字符串和 Null 值 - XMLIGNORENULL、XMLNIL 和 XML…...

Asp.net core WebApi 配置自定义swaggerUI和中文注释

1.创建asp.net core webApi项目 默认会引入swagger的Nuget包 <PackageReference Include"Swashbuckle.AspNetCore" Version"6.2.3" />2.配置基本信息和中文注释&#xff08;默认是没有中文注释的&#xff09; 2.1创建一个新的controller using Micr…...

Xilinx SDK获取代码运行时间

Xilinx SDK获取代码运行时间 一、API 头文件 “xtime_l.h”函数XTime_GetTime(XTime * xtime),获取周期数时钟频率宏 COUNTS_PER_SECOND 二、使用 #include "xtime_l.h"int main(){XTime tBegin, tEnd;unsigned int t_us;unsigned long long cycles;XTime_GetTim…...

【力扣】189. 轮转数组

【力扣】189. 轮转数组 文章目录 【力扣】189. 轮转数组1. 题目介绍2. 解法2.1 方法一&#xff1a;不太正规&#xff0c;但是简单2.2 方法二&#xff1a;使用额外的数组2.3 方法三&#xff1a;环状替换2.4 方法四&#xff1a;数组翻转 3. Danger参考 1. 题目介绍 给定一个整数…...

Spring 拾枝杂谈—Spring原生容器结构剖析(通俗易懂)

目录 一、前言 二、Spring快速入门 1.简介 : 2. 入门实例 : 三、Spring容器结构分析 1.bean配置信息的存储 : 2.bean对象的存储 : 3.bean-id的快捷访问 : 四、总结 一、前言 开门见山&#xff0c;11.25日开始我们正式进入Java框架—Spring的学习&#xff0c;此前&…...

Java核心知识点整理大全22-笔记

目录 19.1.14. CAP 一致性&#xff08;C&#xff09;&#xff1a; 可用性&#xff08;A&#xff09;&#xff1a; 分区容忍性&#xff08;P&#xff09;&#xff1a; 20. 一致性算法 20.1.1. Paxos Paxos 三种角色&#xff1a;Proposer&#xff0c;Acceptor&#xff0c;L…...

qt 5.15.2读取csv文件功能

qt 5.15.2读取csv文件功能 工程文件.pro 内容&#xff1a; QT core#添加网络模块 QT networkCONFIG c17 cmdline# You can make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. #DEFINES QT_DISABLE_DEPREC…...

【Vue】绝了!还有不懂生命周期的?

生命周期 Vue.js 组件生命周期&#xff1a; 生命周期函数&#xff08;钩子&#xff09;就是给我们提供了一些特定的时刻&#xff0c;让我们可以在这个周期段内加入自己的代码&#xff0c;做一些需要的事情; 生命周期钩子中的this指向是VM 或 组件实例对象 在JS 中&#xff0c;…...

关于IP与端口以及localhost

IP和域名 IP地址是一个规定&#xff0c;现在使用的是IPv4&#xff0c;既由4个0-255之间的数字组成&#xff0c;在计算机中&#xff0c;IP地址是分配给网卡的&#xff0c;每个网卡有一个唯一的IP地址。 域名(Domain Name)就是给IP取一个字符的名字&#xff0c;例如http://163.c…...

如何进行MySQL的主从复制(MySQL5.7)

背景&#xff1a;在一些Web服务器开发中&#xff0c;系统用户在进行数据访问时&#xff0c;基本都是直接操作数据库MySQL进行访问&#xff0c;而这种情况下&#xff0c;若只有一台MySQL服务器&#xff0c;可能会存在如下问题 数据的读和写的所有压力都会由一台数据库独…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...