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