Android Settings应用 PreferenceScreen 条目隐藏实现和简单分析

news2024/9/26 10:59:33

Android Settings应用 PreferenceScreen 条目隐藏实现和简单分析

文章目录

  • Android Settings应用 PreferenceScreen 条目隐藏实现和简单分析
    • 一、前言
    • 二、隐藏实现
      • 1、xml 文件中隐藏PreferenceScreen 的某个条目
      • 2、普通Preference条目的隐藏的Java代码实现
      • 3、SwitchPreference条目的隐藏的Java代码实现
      • 4、查找 Preference 对应Java代码的思路
    • 三、其他
      • 1、Preference 条目的隐藏的思路
      • 2、Android Preference简单介绍

一、前言

Android 原生设置Settings应用很多界面都是使用xml的 PreferenceScreen 形式进行显示,
PreferenceScreen 里面包含很多条目,如果要隐藏某个条目就要修改xml或者Java代码,
有些情况修改xml是无效的,修改Java代码才有作用。

本文简单记录一下Settings PreferenceScreen 某个条目隐藏实现。

网上百度到的像View那样隐藏item的代码肯定是不对的。

在这里插入图片描述
上面 Preference 代码的显示和隐藏使用的是View的那套。

上面百度生成的答案是错误的参考示例。
具体实现下面有分析讲解。

二、隐藏实现

已原生Android14 Settings的某个xml和相关Java文件做讲解。

1、xml 文件中隐藏PreferenceScreen 的某个条目

wifi设置里面的“网络偏好设置”的xml 布局:
Settings\res\xml\wifi_configure_settings.xml

<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:settings="http://schemas.android.com/apk/res-auto"
    android:title="@string/wifi_configure_settings_preference_title">

    <SwitchPreference
        android:key="enable_wifi_wakeup"
        android:title="@string/wifi_wakeup"
        android:icon="@drawable/ic_auto_wifi"
        android:summary="@string/wifi_wakeup_summary"
        settings:isPreferenceVisible="false"
        settings:controller="com.android.settings.wifi.WifiWakeupPreferenceController"/>

...
    <SwitchPreference
        android:isPreferenceVisible="false"
        android:key="ethernet_turn_off"
        android:summary="ethernet info"
        android:title="ethernet_turn_off" />

    <Preference
        android:key="install_credentials"
        settings:isPreferenceVisible="false"
        android:title="@string/wifi_install_credentials"/>

    <Preference
        android:key="wifi_direct"
        settings:isPreferenceVisible="false"
        android:title="@string/wifi_menu_p2p"
        android:fragment="com.android.settings.wifi.p2p.WifiP2pSettings" />

</PreferenceScreen>

上面的条目都添加了隐藏代码:

settings:isPreferenceVisible="false"

但是实际上只有 ethernet_turn_off 和 install_credentials 会隐藏,其他的条目设置后是没有作用的。

所以xml中直接写隐藏实现,是不一定有用的,
实际项目中需要查看Java代码中有没有对其进行控制。

查看一下Java实现代码发现要做如下修改才能隐藏相关条目:

2、普通Preference条目的隐藏的Java代码实现

"WLAN直连"选项:

public class WifiP2pPreferenceController extends AbstractPreferenceController {
    private static final String KEY_WIFI_DIRECT = "wifi_direct";
    @Override
    public boolean isAvailable() {
        return false; //false 是不可见
    }
}

AbstractPreferenceController 是 androidx.preference.Preference 原生的,实现 isAvailable() 方法即可决定该条目的隐藏和显示。

3、SwitchPreference条目的隐藏的Java代码实现

"自动开启WLAN"选项:


public class WifiWakeupPreferenceController extends TogglePreferenceController {

    private static final String KEY_ENABLE_WIFI_WAKEUP = "enable_wifi_wakeup";

    @Override
    public int getAvailabilityStatus() {
        //set visible false change by liwenzhi
        if (true) {
            return DISABLED_FOR_USER; //不可见
        }
        return AVAILABLE; //可见
    }

}

TogglePreferenceController 是 Settings自定义的,实现 getAvailabilityStatus() 方法即可决定该条目的隐藏和显示。

4、查找 Preference 对应Java代码的思路

xml 中 Preference 主要代码:

    <XXXPreference
        android:key="keyName"
        .../>

每个 Preference 都是要定义key 的,Java代码所以Java代码中要找到这个 Preference ,就要通过这个keyName ,类似findViewById那样。

所以控制这个 Preference 的Java 代码,肯定会定义对应的keyName。

而找到这个 Preference 也是可以手动对其进行隐藏或者显示的。

SwitchPreference switchPreference = (SwitchPreference) findPreference("ethernet_turn_off");
switchPreference.setVisible(false);//true是显示,false是隐藏

三、其他

1、Preference 条目的隐藏的思路

(1)查看Java代码中有没有控制 Preference 的显示和隐藏

1、查看对于的控制类有没有 isAvailable() 方法的实现
2、查看对应的控制类有没有 getAvailabilityStatus() 方法的实现
3、查看对应的控制类没有直接控制 setVisible 方法的调用

(2)如果Java代码没有控制直接在xml中修改即可

settings:isPreferenceVisible="false"

如果需要自己属性控制隐藏显示的,那么也是只能在Java代码中控制。

简单的说就是xml修改显示隐藏不一定生效,主要还是要看Java 是否控制。

2、Android Preference简单介绍

PreferenceScreen和SwitchPreference 简单示例
相关demo代码示例
(1)SettingsActivity.Java
(2)layout\settings_activity.xml
(3)xml\root_preferences.xml
(4)build.gradle
(5)示例demo效果:

相关链接:

https://blog.csdn.net/wenzhi20102321/article/details/136902514

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1920157.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

bevfomer self-att to transformer to tensorrt

self-attentation https://blog.csdn.net/weixin_42110638/article/details/134016569 query input* Wq key input* Wk value input* Wv output 求和 query . key * value detr multiScaleDeformableAttn Deformable Attention Module&#xff0c;在图像特征上&#…

STM32读取LX-224总线舵机信息

一、舵机指令包格式 帧头&#xff1a; 连续收到两个 0x55 ,表示有数据包到达。ID: 每个舵机都有一个 ID 号。ID 号范围 0&#xff5e;253,转换为十六进制 0x00&#xff5e;0xFD。广播 ID: ID 号 254(0xFE) 为广播 ID,若控制器发出的 ID 号为 254(0xFE)&#xff0c;所有的舵机均…

DockerFile文件解析

DockerFile 要研究自己如何做一个镜像&#xff0c;而且微服务项目打包上云部署&#xff0c;Docker就是最方便的。 微服务打包成镜像&#xff0c;任何装了Docker的地方&#xff0c;都可以下载使用&#xff0c;极其的方便。 流程&#xff1a;开发应用>DockerFile>打包为…

c++ 建造者模式

文章目录 建造者模式为什么使用建造者模式建造者模式实现步骤实现示例建造者模式优缺点 建造者模式 建造者模式&#xff08;Builder Pattern&#xff09;是面向对象设计模式中的一种&#xff0c;主要用于创建复杂对象。这种模式将对象的构建过程与其表示分离&#xff0c;允许用…

Qt+ESP32+SQLite 智能大棚

环境简介 硬件环境 ESP32、光照传感器、温湿度传感器、继电器、蜂鸣器 基本工作流程 上位机先运行&#xff0c;下位机启动后尝试连接上位机连接成功后定时上报传感器数据到上位机&#xff0c;上位机将信息进行处理展示判断下位机传感器数据&#xff0c;如果超过设置的阈值&a…

电商出海第一步,云手机或成重要因素

电商出海第一步并非易事&#xff0c;挑战和机遇并存&#xff0c;出海企业或个人或将借助云手机从而达成商业部署全球化的目的&#xff1b; 下面我们从网络稳定、数据安全、成本、以及多平台适配方面来看&#xff0c;究竟为什么说云手机会成为出海的重要因素&#xff1b; 首先…

图谱动态240709

本期将分享近期全球知识图谱相关 行业动态、会议资讯、论文推荐 —--| 行业动态 |--— 微软开源GraphRAG 7月2日&#xff0c;微软开源了GraphRAG&#xff0c;一种基于图的检索增强生成(RAG) 方法&#xff0c;可以对私有或以前未见过的数据集进行问答&#xff08;开源地址&…

ENSP防火墙

实验拓扑图 需求&#xff1a; ENSP的配置&#xff1a; 防火墙&#xff1a; 交换机&#xff1a; 华为防火墙的配置&#xff1a; 接口配置&#xff1a; 安全区域&#xff1a; 安全策略&#xff1a; 办公区访问DMZ&#xff1a; 生产区访问DMZ&#xff1a; 游客区只能访问门户网…

USB转RS485+RS232+TTL串口电路

USB转RS485RS232TTL电路 USB转RS485RS232TTL电路如下图所示&#xff0c;可实现USB转RS485RS232TTL串口&#xff0c;一个电路模块即可实现电路调试过程中用到常用接口。 电路模块上留有2.54MM单排针接口和接线端子两种接线方式&#xff0c;可接线和跳线。电路模块同时有5V和3.3V…

Vulkan入门系列0- Vulkan与OpenGL的区别

一:概述 Vulkan 是新一代图形和计算API,是由科纳斯组织(Khronos Group)维护的一套跨平台的、开放标准的、现代GPU 的编程接口,它仅仅是规定了一套编程接口,并没有接口的具体实现,实现是由硬件厂商适配实现的,市面上像NVIDIA、AMD和Intel等国际大厂基本提供了完整的…

C++ enum class转常量

当使用 enum class 时&#xff0c;它具有更强的类型安全性和隔离性&#xff0c;因此需要显式转换才能访问其底层整数值。 std::underlying_type_t 是一个类型别名&#xff0c;它返回枚举类型的底层类型。 to_underlying 函数提供了一种方便的方式来执行这种转换&#xff0c;特别…

vb.netcad二开自学笔记8:界面之任务窗格

使用net可以创建一个类似属性面板的自定义的任务窗格&#xff0c;从而实现应用程序更丰富的人机交互。 1、添加一个自定义控件 2、在前面创建的代码框架内增加一个命令函数ShowMyPalette Imports System.Windows.Media.Imaging Imports Autodesk.AutoCAD.ApplicationServices …

python的简单爬取

需要的第三方模块 requests winr打开命令行输入cmd 简单爬取的基本格式&#xff08;爬取百度logo为例&#xff09; import requests url"http://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png" resprequests.get(url)#回应 #保存到本地 with open(&…

5G中的RedCap

5G中的RedCap&#xff1a;降低能力的重要性和实现方式 随着5G技术的推广和普及&#xff0c;设备和终端的多样化使得网络能力的管理变得更加复杂和关键。RedCap&#xff08;Reduced Capability&#xff09;作为一个重要的概念&#xff0c;旨在解决设备能力差异对网络服务和用户…

基于PID控制器的双容控制系统matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1PID控制器的基本原理 4.2双容水箱系统的数学模型 5.完整工程文件 1.课题概述 基于PID控制器的双容控制系统matlab仿真&#xff0c;仿真输出PID控制下的水位和流量两个指标。 2.系统仿真结果 &…

部署YUM仓库及NFS共享功能

目录 一、YUM仓库服务 1、YUM仓库概述 2、准备安装源 2.1、软件仓库的提供方式 2.2、 RPM软件包的来源 3、YUM主配置文件 4、软件卸载 5、YUM源的提供方式 5.1、配置本地YUM源仓库 5.2、配置ftp源 5.2.1、服务端配置 5.2.2、客户端配置 二、NFS共享存储 1、NFS基…

Element UI 添加自定义图标

Element UI 自带的默认图标 随着项目的越来越大&#xff0c;图标总是不够用&#xff0c;接下来就给大家说明下如何添加自定义图标 首页给大家介绍一个图标网站&#xff1a;iconfont-阿里巴巴矢量图标库 网站上有很多设计好的图标&#xff0c;基本都有你想要的了&#xff0c…

【RHCE】系统服务综合实验

一、实验内容 现有主机 node01 和 node02&#xff0c;完成如下需求&#xff1a; 1、在 node01 主机上提供 DNS 和 WEB 服务 2、dns 服务提供本实验所有主机名解析 3、web服务提供 www.rhce.com 虚拟主机 4、该虚拟主机的documentroot目录在 /nfs/rhce 目录 5、该目录由 node02…