当前位置: 首页 > 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;可能会存在如下问题 数据的读和写的所有压力都会由一台数据库独…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

6.计算机网络核心知识点精要手册

计算机网络核心知识点精要手册 1.协议基础篇 网络协议三要素 语法&#xff1a;数据与控制信息的结构或格式&#xff0c;如同语言中的语法规则语义&#xff1a;控制信息的具体含义和响应方式&#xff0c;规定通信双方"说什么"同步&#xff1a;事件执行的顺序与时序…...

HTML中各种标签的作用

一、HTML文件主要标签结构及说明 1. <&#xff01;DOCTYPE html> 作用&#xff1a;声明文档类型&#xff0c;告知浏览器这是 HTML5 文档。 必须&#xff1a;是。 2. <html lang“zh”>. </html> 作用&#xff1a;包裹整个网页内容&#xff0c;lang"z…...

【工具教程】多个条形码识别用条码内容对图片重命名,批量PDF条形码识别后用条码内容批量改名,使用教程及注意事项

一、条形码识别改名使用教程 打开软件并选择处理模式&#xff1a;打开软件后&#xff0c;根据要处理的文件类型&#xff0c;选择 “图片识别模式” 或 “PDF 识别模式”。如果是处理包含条形码的 PDF 文件&#xff0c;就选择 “PDF 识别模式”&#xff1b;若是处理图片文件&…...

构建Docker镜像的Dockerfile文件详解

文章目录 前言Dockerfile 案例docker build1. 基本构建2. 指定 Dockerfile 路径3. 设置构建时变量4. 不使用缓存5. 删除中间容器6. 拉取最新基础镜像7. 静默输出完整示例 docker runDockerFile 入门syntax指定构造器FROM基础镜像RUN命令注释COPY复制ENV设置环境变量EXPOSE暴露端…...

今日行情明日机会——20250609

上证指数放量上涨&#xff0c;接近3400点&#xff0c;个股涨多跌少。 深证放量上涨&#xff0c;但有个小上影线&#xff0c;相对上证走势更弱。 2025年6月9日涨停股主要行业方向分析&#xff08;基于最新图片数据&#xff09; 1. 医药&#xff08;11家涨停&#xff09; 代表标…...