Settings模块的简单设计

2023-05-16

Settings 模块简单设计

任务 1

在一级菜单页底部增加一行,点击这行,跳转到二级菜单,在二级菜单,有一行,是开关按钮,可以记录上次的选中状态。

解决思路

首先在设置中寻找相似的功能,如:top_level_accounts 账户功能,查看其相应的 fragment 和 xml 以及 controller,复制后根据自己的需求进行修改与删除。
方法一:

  • 步骤一: 在 res/xml/top_level_settings.xml 后面添加 Preference,并根据需要添加元素。
<!-- fragment:二级菜单碎片-->
<!-- icon:图标-->
<!-- key:key标识 相当于 id-->
<!-- order:排序  上下顺序随着数字增大而下降(数字越大排列越下)-->
<!-- title:标题  -->
<!-- summary:概要 -->
<!-- controller:控制器  功能的实现-->
    <Preference
        android:key="top_level_statusrecord"
        android:summary="@string/statusrecord_summary"
        android:title="@string/status_record"
        android:order="110"
        android:icon="@drawable/ic_homepage_status_record"                       
        android:fragment="com.android.settings.deviceinfo.aboutphone.StatusRecordFragment" />
  • 步骤二:在 res/xml/statusrecord.xml 根据需要创建 xml 文件
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:key="switch_status_settings">
    <!-- summaryOn 开关开启时显示的文本-->
    <!-- summaryOff 开关关闭时显示的文本-->
    <SwitchPreference
        android:key="switch_change"
        android:title="@string/switch_change_title"
        android:summary="@string/switch_change_summary"
        android:summaryOn="@string/switch_change_on_summary"
        android:summaryOff="@string/switch_change_off_summary" />
</PreferenceScreen>
  • 步骤三:在 src/com/android/settings/custom/StatusRecordFragment.java 根据需要创建java文件
package com.android.settings.custom;

import android.app.settings.SettingsEnums;
import android.content.Context;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.widget.Toast;

import androidx.preference.Preference;
import androidx.preference.SwitchPreference;

import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment;


public class StatusRecordFragment extends DashboardFragment {

    private static final String TAG = "StatusRecordFragment";
	// 定义开关变量
    private SwitchPreference switchCustomConfig;
    // 定义上下文
    private Context mContext;
    // 定义开关状态变量
    private Boolean value;

    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        super.onCreatePreferences(savedInstanceState, rootKey);

        switchCustomConfig = findPreference("switch_change");
		// 获取 xml 界面
		// addPreferencesFromResource(R.xml.statusrecord);
        // 获取开关的状态,第一次进去设置默认值为 1
        value = Settings.Global.getInt(mContext.getContentResolver(), "switchPreference", 0) == 1;

        // 通过查询取出的value值判断设置开关的状态
        switchCustomConfig.setChecked(value);

        // 设置开关的监听状态
        switchCustomConfig.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                value = (Boolean) newValue;
                // 把开关的状态值存入
                Settings.Global.putInt(mContext.getContentResolver(), "switchPreference", (Boolean) newValue ? 1 : 0);
                // 开启
                return true;
            }
        });
    }



    @Override
    public int getMetricsCategory() {
        return SettingsEnums.ACCOUNT ;
    }

    @Override
    protected String getLogTag() {
        return TAG;
    }

    @Override
    protected int getPreferenceScreenResId() {
        return R.xml.statusrecord;

    }
    @Override
    public int getHelpResource() {
        return super.getHelpResource();
    }

    // 获取上下文
    @java.lang.Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mContext = context;
    }
}

任务 2

隐藏“设置->关于手机->Legal information”菜单.

解决思路

百度 在 my_divice_info.xml 文件的 android:key=“legal_container” 的 Preference 下添加
settings:searchable=“false” 试验后发现是屏蔽关键词,并未隐藏
应添加 settings:isPreferenceVisible=“false” 试验后 成功。

    <Preference
        android:key="legal_container"
        android:order="15"
        android:title="@string/legal_information"
        android:fragment="com.android.settings.LegalSettings"
        settings:allowDividerAbove="true"
        settings:isPreferenceVisible="false" />

任务 3

将“设置->关于手机->版本号”移到到上一层界面

解决思路

首先从二级菜单中找到版本号,将版本号的 preference 复制到一级模块中,push 后发现点击后会出现闪退;
找出原因为无法显示点击功能,则进入版本号 BuildNumberPreferenceController.java 查看代码,自定义 CustomBuildNumberPreferenceController.java 将 handlePreferenceTreeClick() 、onActivityResult()、 enableDevelopmentSettings()、注释后则可以使点击功能失效;
如果想要将版本号的启动开发者功能则需要进入 src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java 搜索 BuildNumberPreferenceController 将与之相关的代码复制到 src/com/android/settings/homepage/TopLevelSettings.java 中,且重新使用版本号的BuildNumberPreferenceController.java。

    <!-- Build number -->
    <Preference
        android:key="build_number"
        android:order="120"
        android:title="@string/build_number"
        android:summary="@string/summary_placeholder"
        settings:allowDividerAbove="true"
        settings:enableCopying="true"
        settings:controller="com.android.settings.deviceinfo.BuildNumberPreferenceController"/>
	// 导包
	import com.android.settings.deviceinfo.BuildNumberPreferenceController;
	// 定义变量
    private BuildNumberPreferenceController mBuildNumberPreferenceController;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        use(SupportPreferenceController.class).setActivity(getActivity());
        mBuildNumberPreferenceController = use(BuildNumberPreferenceController.class);
        mBuildNumberPreferenceController.setHost(this /* parent */);
    }
        
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (mBuildNumberPreferenceController.onActivityResult(requestCode, resultCode, data)) {
            return;
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

Error 与 解决方法

push error

remote couldn’t create file: Read-only file system

解决方法:
adb disable-verity
adb reboot
adb root
adb remount

remote write failed: No space left on device
解决方法:
adb root
adb remount

strings error

设置 string 值时注意事项:
需要在 res/values/strings.xml 与 res/values-zh-rCN/strings.xml 同时添加
且可以在 该目录寻找自己所需的信息

    <string name="statusrecord_summary">Switch button for recording status</string>
    <string name="status_record">Status record</string>
    <string name="switch_change_title">Switch</string>
    <string name="switch_change_summary">Hello, this is the switch button</string>
    <string name="switch_change_on_summary">Hello, the switch button is on</string>
    <string name="switch_change_off_summary">Hello, the switch button is off</string>
    
    <string name="status_record">状态记录</string>
    <string name="statusrecord_summary">记录状态的开关按钮</string>
    <string name="switch_change_title">开关</string>
    <string name="switch_change_summary">你好,我是开关按钮</string>
    <string name="switch_change_on_summary">你好,开关按钮开启了</string>
    <string name="switch_change_off_summary">你好,开关按钮关闭了</string>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Settings模块的简单设计 的相关文章

  • asp.net 设置是否影响经典 asp(IIS 6 设置)

    我的公司有一些经典的 asp 站点并在 asp net 中开发新站点 每次我们在 IIS 6 中创建新站点时 所有站点都会宕机几秒钟 因此 我正在考虑将 ASP NET 版本的默认值更改为 2 x 因为这是我们正在开发的版本 我想知道这些设
  • 我应该在哪里存储应用程序特定的设置?

    我被要求更新过去 6 年在 WinXP 上运行的 VB6 应用程序 客户想要使用 Windows 7 到目前为止 应用程序将其设置存储在位于应用程序目录中的 INI 文件中 XP 和 7 之间的一个关键区别是您无法写入C Program F
  • MATLAB 设置 - 如果出现错误则停止

    我发现 出错时始终停止 如果出错则停止 在调试 MATLAB 代码时非常有用 但是 关闭 matlab 也会将其重置为 如果出现错误 永不停止 我怎样才能让这个设置持续存在 这确实是解决方案 在 Mathworks 中进一步挖掘得出了确切的
  • 如何在 Sublime Text 4(Windows)中显示菜单栏

    我更新了我的 sublime 文本 之后我似乎看不到屏幕顶部的菜单栏 但现在必须单击 3 行按钮才能查看它 有什么方法可以让菜单栏再次像平常一样显示吗 我尝试 查看 并启用它 但找不到任何 菜单栏设置 我认为显示汉堡菜单是您当前主题的一个特
  • 我如何在android上设置相机防抖(图像稳定器)功能

    我制作了一个相机应用程序 我想添加防抖功能 但我找不到防抖 图像稳定器 的设置 请帮助我 通常图像稳定器是内置的相机功能 而OIS 光学图像稳定 是内置的hardware特征 到目前为止 很少有设备支持它们 如果设备没有内置功能 我认为您无
  • 系统设置意图后无法返回活动

    在我的应用程序中 我需要进入手机的设置活动来激活 GPS 并希望使用以下代码返回我的应用程序 Intent intent new Intent Settings ACTION LOCATION SOURCE SETTINGS startAc
  • 在 QT 中将配置设置保存到 XML 文件吗?

    我想将配置设置保存到 QT 中的 XML 文件并从那里读取它 在 QT 中执行此操作的最佳方法是什么 任何样品 想法都受到高度赞赏 Thanks 您可以使用以下方式注册您的 XML 文件格式QSettings registerFormat
  • 如何将自定义类保存/序列化到设置文件?

    我有一个小类 包含两个字符串 如下所示 public class ReportType private string displayName public string DisplayName get return displayName
  • 在 Excel Desktop 中创建和设置 Office.Settings 后,无法在 Excel Online 中检索

    根据 API 文档 办公室 设置 https learn microsoft com en us javascript api office office settings view excel js preview对象按加载项和每个文档保
  • VS 代码评论面板

    我正在看 comments openPanel openOnSessionStartWithComments 在 VS Code 中设置 但我不太明白这是如何工作的 我在 Google 或 StackOverflow 上找不到任何关于此的信
  • Java Swing 保存和加载工作区/设置

    我有一个 Java Swing 应用程序 其中包含一堆框架 而这些框架又主要包含显示大量数据的表格 由于在启动时安排所有窗口和表格总是很麻烦且耗时 因此我想实现 工作区 功能 以便用户可以保存首选项设置并在启动时选择自动将存储的工作区加载到
  • iOS 启动设置 -> 限制 URL 方案

    我最近发现了一个很棒的iOS5自定义设置URL方案 这可以在这个伟大的website http handleopenurl com scheme apple settings app 我发现这很有效 将用户从我的应用程序引导到 设置 应用程
  • 如何禁止chrome打开“新窗口”和“标签”?

    他们是否可以通过 Chrome 浏览器设置将互联网上的所有页面保留在一个窗口中 或者我可以用一个插件 插件来做到这一点 当我单击某些链接时 我不希望在新选项卡和 或新窗口中打开网页 如果有人有任何建议请告诉我 谢谢 a href http
  • iOS 获取代理设置

    在我的项目中 我使用 libcurl 通过互联网下载数据 问题是 libcurl 无法检测 wifi 连接的代理设置 我必须手动设置 libcurl 的设置 所以我想知道如何获取 wifi 连接的代理设置 我在钥匙串中找到了一些有关信息的线
  • git 的“文件模式”是什么?

    什么是 gitfilemode 对我来说 它在每个仓库中 git config文件 靠近顶部 core filemode true 它是什么 这是什么意思 与以下有什么关系吗 bare false 我也不太明白 A git 裸仓库 详细信息
  • 如何在 Windows 上的 Eclipse 中设置 Clang 工具链?

    我为一个愚蠢的问题道歉 但我在网上找不到答案 我正在努力为 64 位计算机上的 Windows 7 中的 Eclipse 设置 Clang 编译器 链接器 我对 C 的了解非常过时 并且从未在 Eclipse 中工作过 我想要实现的是在 W
  • 在 iOS 上保存(私人)应用程序设置?

    我知道NSUserDefaults用于保存 恢复user优先 什么是等效类应用 例如 应用程序可能有一个 上次运行 字段 或者它可能有一个用于在应用程序级别使用的设备的唯一标识的字段 我的目的是将应用程序的设置 而不是用户的设置 保留在设置
  • 从应用程序打开无线设置

    我想直接从我的应用程序打开 设置 gt 无线和网络 我怎样才能做到这一点 尝试这个 startActivity new Intent android provider Settings ACTION WIRELESS SETTINGS 或者
  • 如何使用 cordova 打开设备中的设置页面

    我正在使用 apache cordova 构建一个应用程序 并且我已经可以使用以下命令检查蓝牙是否可用蓝牙串行插件 https github com don BluetoothSerial 如果不是 那么我会重定向到一个页面 其中有一个按钮
  • 如何向 iPhone 设置页面添加按钮?

    在 首选项 应用中 Safari 的设置页面包含标有 清除历史记录 或 清除缓存 的按钮 邮件应用程序的设置页面包含一个红色的大 删除帐户 按钮 有没有办法为我的应用程序创建这样一个带有按钮的设置页面 我检查了苹果的文档 http deve

随机推荐

  • 美团3.25笔试记录-第一题

    第一题 xff1a 题目描述 xff1a 小美是一个火车迷 最近她在观察家附近火车站的火车驶入和驶出情况 xff0c 发现火车驶入和驶出的顺序并不一致 经过小美调查发现 xff0c 原来这个火车站里面有一个类似于栈的结构 xff0c 如下图
  • Java中的取模(Math.floorMod())与取余(%)

    在Java中运算符 并不是取模运算 Modulo Operation xff0c 而是取余运算 Complementation 那么取模运算和取余运算的区别是什么呢 xff1f 计算方法 对于整数 a b 来说 xff0c 取模运算和取余运
  • redis的持久化策略

    redis提供持久化策略 xff0c 在适当的时机采用适当的手段把内存中的数据持久化到磁盘中 xff0c 每次redis服务启动时 xff0c 都可以把磁盘上的数据再次加载到内存中使用 RDB策略 xff08 数据快照模式 xff09 xf
  • HashMap的7种遍历方式

    HashMap的遍历方式 从大方向来说 xff0c HashMap遍历方式可以分为4类 xff1a 迭代器 xff08 Iterator xff09 方式遍历 xff1b For Each方式遍历 xff1b Lambda表达式遍历 xff
  • C语言中如何计算结构体的大小

    由于存储变量地址对齐的问题 xff0c 计算结构体大小的3条规则 xff1a 结构体的大小由n个 结构体中最大的那个类型 的大小模块组成 xff08 n lt 61 成员个数 xff09 xff1b 一个模块中 xff0c 可以存储多个成员
  • java多线程七大编程题(十分受用)

    前置须知知识 java多线程的实现方式主要由两种 一 创建子类继承Thread类 xff0c 重写run方法 span class token keyword public span span class token keyword cla
  • Java笔记(5)——类的继承、访问控制、super关键字

    在类中 xff0c 不写构造方法 xff0c 相当于执行了默认的无参构造方法 xff1b 写了有参构造方法 xff0c 则只执行有参构造方法 xff0c 默认的无参构造方法则会被屏蔽掉 xff1b 若想拥有有参和无参构造方法 xff0c 则
  • 配置maven使用本地仓库

    由于工作时是在内网环境 xff0c maven无法连接互联网 xff0c 所以只能事先将jar下载到本地 xff0c 然后通过配置pom文件 xff0c 将jar引用至本地仓库即可 1 首先 xff0c 我们需要打开本地的仓库 xff0c
  • Java中常用的几种JSON格式的转换

    JSON在传输数据时 xff0c 起到了特别大的作用 xff0c 因此出现了各种各样五花八门的JSON转换第三方包 xff0c 在这里做一个汇总 xff0c 总结一些常用的 目录 com alibaba fastjson 常用的API Ls
  • ESP32C3驱动中景园ST7789tft屏

    编译器 xff1a Arduino IDE 2 0 4 材料 xff1a 杜邦线8根 第一步 xff1a 安装所需要的库 xff0c TFT eSPI 43 Digital Rain Animation 第二步 选择适应屏幕的大小型号和颜色
  • ubuntu16.04安装python3.6最新 踩坑无数的经验

    希望你看到这篇文章的时候 能够在筛选里选择最新发布的文章 我看了很多2019 2020的最热文章 xff01 结果全部安装失败 xff01 不是责怪他们的方法有问题 xff0c 而是你看他们文章的时间和他么你操作的时间有时间差 xff0c
  • 【已解决】Uncaught SyntaxError: Unexpected token ‘var‘

    问题描述 xff1a 注释问题 今天在用IDEA写JS的时候 xff0c 写到预加载事件前需要一个全局变量 xff0c 定义完之后 xff0c 习惯性的全局格式对齐 xff0c IDEA的语法提示并没有异常 xff0c 像这样 进入页面发现
  • Ubuntu 配置ssh教程

    安装的时候安装ssh服务 进入管理员root xff0c 进入管理员root有两种情况 xff1a 一 知道密码 xff0c 输入su root回车 xff0c 再输入密码 二 不知道密码 xff0c 首先输入sudo passwd roo
  • CentOS8如何安装bochs2.6.11(上)

    1 xff1a 下载压缩包 bochs2 6 11https sourceforge net projects bochs files bochs 2 6 11 2 xff1a 解压压缩包 tar span class token oper
  • Response.addHeader()和Response.setHeader()的区别,别再傻傻分不清;

    1 setHeader response setHeader mytest aa response setHeader mytest bb Header中 xff1a k1 mytest v1 34 bb 34 2 addHeader re
  • Ubuntu桌面更改显示管理器方式

    1 常见的显示管理器gdm3 xff0c lightdm xff0c sddm 安装方式 span class token function sudo span span class token function apt get span
  • Ubuntu忘记开机密码(初始化开机密码绝对有效)

    ubuntu忘记开机密码 xff08 无需root密码即可修改开机密码 xff09 1 重启ubuntu xff0c 随即长按shift进入grub菜单 xff1b 2 选择recovery mode xff0c 按 34 e 34 键进入
  • Java笔记(6)——多态、instanceof操作符和一个几何形体的例子

    1 多态 多态 xff1a 同样的类型变量 xff0c 调用同样的方法 xff0c 却产生完全不同的行为 当父类类型的变量指向子类的对象 xff0c 调用父类中已经被重写的方法时 xff0c 产生多态机制 在多态的情况下 xff0c 不能调
  • Windows Ubuntu双系统 设置启动方式

    文章目录 0 引言1 解决2 参考 0 引言 在安装双系统之后 xff0c 在启动的时候提供一个选项 xff0c 默认是Ubuntu的启动方式 xff0c 并且在几秒之后默认启动 xff0c 可能我们经常使用的是windows系统 xff0
  • Settings模块的简单设计

    Settings 模块简单设计 任务 1 在一级菜单页底部增加一行 xff0c 点击这行 xff0c 跳转到二级菜单 xff0c 在二级菜单 xff0c 有一行 xff0c 是开关按钮 xff0c 可以记录上次的选中状态 解决思路 首先在设