Bootstrap

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

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;