当前位置: 首页 > news >正文

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

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

<PreferenceScreenxmlns: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"><SwitchPreferenceandroid: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"/>...<SwitchPreferenceandroid:isPreferenceVisible="false"android:key="ethernet_turn_off"android:summary="ethernet info"android:title="ethernet_turn_off" /><Preferenceandroid:key="install_credentials"settings:isPreferenceVisible="false"android:title="@string/wifi_install_credentials"/><Preferenceandroid: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";@Overridepublic 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";@Overridepublic int getAvailabilityStatus() {//set visible false change by liwenzhiif (true) {return DISABLED_FOR_USER; //不可见}return AVAILABLE; //可见}}

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

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

xml 中 Preference 主要代码:

    <XXXPreferenceandroid: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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 102.qt qml-最全Table交互之多列固定、行列拖拽、自定义委托、标题交互使用教程
  • PostGIS2.4服务器编译安装
  • 宝塔面板运行Admin.net框架
  • linux ssh 远程执行shell 获取返回值
  • Objective-C 中的 isa 不再是简单的结构体指针
  • 树莓派pico入坑笔记,dht11使用及温湿度表制作
  • C语言从头学31——与字符串变量相关的几个函数
  • 各地户外分散视频监控点位,如何实现远程集中实时监看?
  • 大整数加法C++
  • STM32H7之DMD2D是个啥
  • 如何理解李彦宏说的”不要卷模型,要卷应用
  • 绝区伍--2024年AI发展路线图
  • 模拟防止重复提交
  • 用智能方法设计量子点半导体光放大器
  • 数据结构第22节 堆排序优化
  • conda常用的命令
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • Github访问慢解决办法
  • JAVA SE 6 GC调优笔记
  • Just for fun——迅速写完快速排序
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • SQLServer插入数据
  • Vultr 教程目录
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 飞驰在Mesos的涡轮引擎上
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 微信小程序设置上一页数据
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (强烈推荐)移动端音视频从零到上手(上)
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (算法)前K大的和
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)http协议
  • (转)四层和七层负载均衡的区别
  • .NET Core 成都线下面基会拉开序幕
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .net 连接达梦数据库开发环境部署
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • .NET下的多线程编程—1-线程机制概述
  • /etc/shadow字段详解
  • [ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429
  • [012-1].第12节:Mysql的配置文件的使用
  • [20171113]修改表结构删除列相关问题4.txt
  • [52PJ] Java面向对象笔记(转自52 1510988116)
  • [Ariticle] 厚黑之道 一 小狐狸听故事
  • [BetterExplained]书写是为了更好的思考(转载)
  • [c]扫雷