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

Pip生成requirements.txt文件

在Python开发中&#xff0c;requirements.txt文件是一个非常重要的文件&#xff0c;它列出了项目所需的所有外部Python库及其版本号。这对于项目的部署和版本控制非常有帮助&#xff0c;因为它确保了所有开发者和部署环境都能使用相同版本的库。 如何生成requirements.txt文件 …...

ide-eval-resetter:开发者必备的JetBrains IDE试用期管理工具

ide-eval-resetter&#xff1a;开发者必备的JetBrains IDE试用期管理工具 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 在软件开发过程中&#xff0c;JetBrains IDE&#xff08;集成开发环境&#xff0c;用于编…...

蒲公英R300A 4G路由器实战:工业PLC远程监控全流程解析

1. 工业场景下的远程监控挑战 在工业自动化领域&#xff0c;PLC&#xff08;可编程逻辑控制器&#xff09;就像工厂的"大脑"&#xff0c;24小时不间断地控制着生产线运转。但传统PLC监控有个痛点&#xff1a;工程师必须亲临现场才能调试设备&#xff0c;遇到半夜设备…...

避坑指南:RK3588 HDMI输出分辨率不生效?除了改驱动,你还需要检查这几点

RK3588 HDMI输出分辨率调试实战&#xff1a;从代码修改到系统级排查 最近在调试RK3588平台的HDMI输出时&#xff0c;发现一个有趣的现象&#xff1a;明明按照官方文档和社区教程修改了内核驱动代码&#xff0c;添加了3840x216030Hz的分辨率支持&#xff0c;但系统设置里就是找不…...

OpenClaw配置备份方案:Qwen3.5-9B模型迁移无忧指南

OpenClaw配置备份方案&#xff1a;Qwen3.5-9B模型迁移无忧指南 1. 为什么需要OpenClaw配置备份 上周我的MacBook突然黑屏送修&#xff0c;维修人员告诉我主板需要更换。那一刻我突然意识到&#xff1a;过去三个月精心调校的OpenClaw配置可能面临灭顶之灾。特别是那个与Qwen3.…...

科研助手实战:OpenClaw+Phi-3-vision自动整理文献图表数据

科研助手实战&#xff1a;OpenClawPhi-3-vision自动整理文献图表数据 1. 为什么需要自动化文献整理 作为一名经常需要阅读大量论文的研究者&#xff0c;我发现自己花费在整理文献数据上的时间越来越长。每次下载几十篇PDF&#xff0c;手动截图关键图表、复制数据表格、整理参…...

OpenClaw+千问3.5-9B社交媒体管理:定时发布与智能互动

OpenClaw千问3.5-9B社交媒体管理&#xff1a;定时发布与智能互动 1. 为什么选择OpenClaw管理社交媒体 去年我开始尝试运营技术类社交媒体账号时&#xff0c;每天要花2-3小时手动处理内容发布和粉丝互动。直到发现OpenClaw这个能直接操控我电脑的AI助手&#xff0c;配合千问3.…...

django基于深度学习的音乐推荐系统_7182nd2n_zl035

前言随着数字音乐时代的到来&#xff0c;人们可以轻松访问数百万首歌曲。然而&#xff0c;如何在海量音乐中找到自己喜欢的音乐成为了一个挑战。基于Django框架和深度学习的音乐推荐系统正是为了解决这一问题而诞生。该系统通过深度学习技术分析用户的历史行为和偏好&#xff0…...

tmux 示例

技术文章大纲示例&#xff1a;人工智能在医疗诊断中的应用 引言 概述人工智能在医疗领域的重要性当前医疗诊断面临的挑战人工智能技术的引入如何改变传统诊断方式 人工智能技术基础 机器学习与深度学习的核心概念计算机视觉在医疗影像分析中的作用自然语言处理&#xff08;NLP&…...

为什么 Multi-Agent 比单 Agent 更难

为什么 Multi-Agent 比单 Agent 更难——从协作黑洞到协同效率巅峰的全维度拆解 (全文预计42万字) 一、 引言:从 ChatGPT 的“天花板对话”到 AgentVerse 的“分布式协作故障”——这才是 AI 应用落地的真实门槛 1.1 钩子(The Hook):单Agent vs Multi-Agent 的两个真实…...