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 表达式遍历 ,简洁又好用!!! 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操作系统的桌面,在学校教学中我们…...
【深度学习】学习率及多种选择策略
学习率是最影响性能的超参数之一,如果我们只能调整一个超参数,那么最好的选择就是它。相比于其它超参数学习率以一种更加复杂的方式控制着模型的有效容量,当学习率最优时,模型的有效容量最大。本文从手动选择学习率到使用预热机制…...
具有“真实触感”的动捕数据手套mhand pro,提供更精确的动作捕捉
随着人工智能的普及和万物互联,vr虚拟技术备受关注,为了更加真实的虚拟现实交互体验,动捕数据手套的使用逐渐普及,vr手套可以实时采集各手指关节运动数据,使用动捕数据手套可以在虚拟现实的场景中实现对真实手部运动的…...
Mongodb使用killCursors停止运行的cursor
cursor指向查询结果的游标,通过游标向下移动,获得下一条查询结果。MongoDB分批向用户返回数据结果。通过游标的移动, mongodb确定当前返回结果的位置,是否要加载更多数据到内存当中。cursor有默认的超时时间, 超时后cu…...
电脑风扇转一下停一下,无法正常开机问题解决
今天同事电话说电脑开不了机了,只听见风扇不停地呜呜地作响。笔者第一反应是不是硬件哪里出问题了,于是二话没说拿起心爱的螺丝刀就闪了过去。 按下电源,确实如电话所述。但感觉风扇并非一直在转,而是时断时续。由于听不大真切&a…...
无需部署服务器,如何结合内网穿透实现公网访问导航页工具Dashy
文章目录 简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问 简介 Dashy 是一个开源的自托管的导航页配置服务,具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你可以将自己常用的一些网站聚合起来放在一起,形成自己的导航…...
Go GORM简介
GORM(Go Object-Relational Mapping)是一个用于Go语言的ORM库,它提供了一种简单、优雅的方式来操作数据库。GORM支持多种数据库,包括MySQL、PostgreSQL、SQLite和SQL Server。以下是GORM的一些主要特性 全功能ORM:GORM…...
前端量子纠缠 效果炸裂 multipleWindow3dScene
我 | 在这里 🕵️ 读书 | 长沙 ⭐软件工程 ⭐ 本科 🏠 工作 | 广州 ⭐ Java 全栈开发(软件工程师) 🎃 爱好 | 研究技术、旅游、阅读、运动、喜欢流行歌曲 ✈️已经旅游的地点 | 新疆-乌鲁木齐、新疆-吐鲁番、广东-广州…...
第十七章 处理空字符串和 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.配置基本信息和中文注释(默认是没有中文注释的) 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 方法一:不太正规,但是简单2.2 方法二:使用额外的数组2.3 方法三:环状替换2.4 方法四:数组翻转 3. Danger参考 1. 题目介绍 给定一个整数…...
Spring 拾枝杂谈—Spring原生容器结构剖析(通俗易懂)
目录 一、前言 二、Spring快速入门 1.简介 : 2. 入门实例 : 三、Spring容器结构分析 1.bean配置信息的存储 : 2.bean对象的存储 : 3.bean-id的快捷访问 : 四、总结 一、前言 开门见山,11.25日开始我们正式进入Java框架—Spring的学习,此前&…...
Java核心知识点整理大全22-笔记
目录 19.1.14. CAP 一致性(C): 可用性(A): 分区容忍性(P): 20. 一致性算法 20.1.1. Paxos Paxos 三种角色:Proposer,Acceptor,L…...
qt 5.15.2读取csv文件功能
qt 5.15.2读取csv文件功能 工程文件.pro 内容: 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 组件生命周期: 生命周期函数(钩子)就是给我们提供了一些特定的时刻,让我们可以在这个周期段内加入自己的代码,做一些需要的事情; 生命周期钩子中的this指向是VM 或 组件实例对象 在JS 中,…...
关于IP与端口以及localhost
IP和域名 IP地址是一个规定,现在使用的是IPv4,既由4个0-255之间的数字组成,在计算机中,IP地址是分配给网卡的,每个网卡有一个唯一的IP地址。 域名(Domain Name)就是给IP取一个字符的名字,例如http://163.c…...
如何进行MySQL的主从复制(MySQL5.7)
背景:在一些Web服务器开发中,系统用户在进行数据访问时,基本都是直接操作数据库MySQL进行访问,而这种情况下,若只有一台MySQL服务器,可能会存在如下问题 数据的读和写的所有压力都会由一台数据库独…...
AlphaFold 3终极指南:掌握Jackhmmer与HMMER提升蛋白质结构预测精度
AlphaFold 3终极指南:掌握Jackhmmer与HMMER提升蛋白质结构预测精度 【免费下载链接】alphafold3 AlphaFold 3 inference pipeline. 项目地址: https://gitcode.com/gh_mirrors/alp/alphafold3 你是否在蛋白质结构预测项目中遇到MSA生成效率低下的瓶颈&#x…...
ARM PMU性能监控单元原理与实践指南
1. ARM PMU性能监控单元概述性能监控单元(PMU)是现代ARM处理器中用于硬件级性能分析的核心组件。它通过一组可编程的硬件计数器,实现对处理器内部各种关键事件的精确测量。这些事件涵盖了从指令执行、缓存访问到内存子系统行为等处理器活动的…...
三步实现跨架构程序兼容:Box64高效架构转换指南
三步实现跨架构程序兼容:Box64高效架构转换指南 【免费下载链接】box64 Box64 - Linux Userspace x86_64 Emulator with a twist, targeted at ARM64, RV64 and LoongArch Linux devices 项目地址: https://gitcode.com/gh_mirrors/bo/box64 你是否曾在ARM64…...
Postgresql基础实践教程(八)
⭐️⭐️⭐️⭐️⭐️ 完整数据详见 练习数据免费 ⭐️⭐️⭐️⭐️⭐️ 六十九、查找会员ID 27的向上推荐链 问题 查找会员ID 27的向上推荐链:即推荐该会员的人,以及推荐那个人的人,依此类推。返回会员ID、名字和姓氏。按会员ID降序排列。…...
LVGL多页面开发避坑:用内部Timer替代轮询,解决页面切换时的内存踩踏问题
LVGL多页面开发中的内存安全实践:用Timer机制替代轮询的工程解决方案 在嵌入式UI开发中,LVGL因其轻量级和跨平台特性成为热门选择。但当项目复杂度提升到多页面交互时,开发者往往会遇到一个棘手问题:如何在频繁切换页面的同时保证…...
php有什么版本,php语言有几个版本
php有什么版本,php语言有几个版本PHP的大版本主要分四支:PHP4/PHP5/PHP6/PHP7 其中,PHP4由于太古老、对OO支持不力已基本被淘汰,请无视PHP4。 PHP6由于基本没有生产线上的应用,还基本只是一款概念产品,很多功能已在PHP…...
03 - 变量与数据类型
03 - 变量与数据类型 变量是编程里最基础的概念,相当于你往电脑里存东西的"容器"。这章我们把变量的命名规则、Python 的几种基本数据类型都过一遍。 变量是什么 说白了,变量就是一个有名字的盒子。你往里面放个东西,以后想用这个…...
yuzu模拟器完整指南:在电脑上畅玩Switch游戏的终极解决方案
yuzu模拟器完整指南:在电脑上畅玩Switch游戏的终极解决方案 【免费下载链接】yuzu 任天堂 Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu 想在电脑上体验任天堂Switch游戏的魅力吗?yuzu模拟器正是你寻找的完美答案。作为…...
完整指南:如何在5分钟内快速上手BioAge生物年龄计算工具包
完整指南:如何在5分钟内快速上手BioAge生物年龄计算工具包 【免费下载链接】BioAge Biological Age Calculations Using Several Biomarker Algorithms 项目地址: https://gitcode.com/gh_mirrors/bi/BioAge BioAge生物年龄计算工具包是一款基于R语言开发的强…...
XXPermissions:Android权限管理框架的架构设计与最佳实践
XXPermissions:Android权限管理框架的架构设计与最佳实践 【免费下载链接】XXPermissions Android Permissions Framework, Adapt to Android 16 项目地址: https://gitcode.com/GitHub_Trending/xx/XXPermissions 在Android应用开发中,权限管理一…...
