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

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

一、前言

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

相关推荐

  1. 微信小程序显示隐藏分享按钮

    2024-07-11 22:32:02       59 阅读
  2. Tomcat异步请求实现原理应用场景简介

    2024-07-11 22:32:02       29 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 22:32:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 22:32:02       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 22:32:02       58 阅读
  4. Python语言-面向对象

    2024-07-11 22:32:02       69 阅读

热门阅读

  1. 数据库(mysql)忘记密码解决办法

    2024-07-11 22:32:02       21 阅读
  2. GET正常,POST获取不到数据

    2024-07-11 22:32:02       20 阅读
  3. scoop安装在D盘

    2024-07-11 22:32:02       21 阅读
  4. 华为机考真题 -- 密码解密

    2024-07-11 22:32:02       19 阅读
  5. 设计模式——单例模式

    2024-07-11 22:32:02       21 阅读
  6. C# 反射

    2024-07-11 22:32:02       19 阅读
  7. Ubuntu 软件源404not found原因及解决办法

    2024-07-11 22:32:02       16 阅读
  8. 拓扑排序(算法篇)

    2024-07-11 22:32:02       23 阅读
  9. SQL 存储过程

    2024-07-11 22:32:02       24 阅读
  10. 大数据面试题之数据湖

    2024-07-11 22:32:02       21 阅读
  11. MySQL常用命令

    2024-07-11 22:32:02       17 阅读
  12. 多态

    多态

    2024-07-11 22:32:02      22 阅读