隐藏设置项
Aosp原生代码中,Settings中的设置项可动态增删创建,在xml布局文件中每个设置项都是一个preference,配置设置项时会指定设置项被点击时要打开页面的Fragment和Controller控制设置项在所在页面的显示效果,如下
<com.android.settings.widget.HomepagePreference
android:fragment="com.android.settings.network.NetworkDashboardFragment"
android:icon="@drawable/ic_settings_wireless"
android:key="top_level_network"
android:order="-150"
android:title="@string/network_dashboard_title"
android:summary="@string/summary_placeholder"
settings:highlightableMenuKey="@string/menu_key_network"
settings:controller="com.android.settings.network.TopLevelNetworkEntryPreferenceController"/>
在上面这段代码是Settings首页中的网络互联网设置项配置,其中各项配置信息解释如下
- fragment:表明设置项被点击时所打开页面的fragment
- icon:表示设置项在Settings首页中的图标,也就是选项最左边的信号图标
- key:是设置项的唯一标识,可以通过key获取页面中的设置项preference
- order:此配置用于调整设置项在页面中的显示位置,一般是个负数,值越小,显示的位置越靠前
- title:设置项标题,表明设置项的功能作用
- summary:设置项的描述信息,描述设置项当前状态或其它信息,可配置value/string.xml中的文字,此处summary_placeholer表示占位字符,后续可根据实际情况在代码中设置
- controller:设置项的控制器,用于控制设置项在当前页面的显示情况和处理设置项的点击事件,summary信息就可以在controller中设置
注意,有些设置项不会在xml布局文件中配置fragment和controller,此时设置项点击打开页面的操作在controller中的handlePreferenceTreeClick()方法中处理,而controller则是在fragment中使用代码创建并且与key绑定在一起
@Override
protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
return buildPreferenceControllers(context, getSettingsLifecycle(), mMetricsFeatureProvider,
this /* fragment */, this /* mobilePlanHost */, this /* LifecycleOwner */);
}
private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
Lifecycle lifecycle, MetricsFeatureProvider metricsFeatureProvider, Fragment fragment,
MobilePlanPreferenceHost mobilePlanHost, LifecycleOwner lifecycleOwner) {
final VpnPreferenceController vpnPreferenceController =
new VpnPreferenceController(context);
final PrivateDnsPreferenceController privateDnsPreferenceController =
new PrivateDnsPreferenceController(context);
final List<AbstractPreferenceController> controllers = new ArrayList<>();
controllers.add(new MobileNetworkSummaryController(context, lifecycle, lifecycleOwner));
controllers.add(new TetherPreferenceController(context, lifecycle));
controllers.add(vpnPreferenceController);
return controllers;
}
方法一
设置项的controller是控制设置项的显示情况,比如sumamry信息,设置项的点击事件,及设置项是否可用,隐藏设置项时可以通过controller中getAvailabilityStatus()的返回值来决定是否显示或者隐藏设置项
@Override
public int getAvailabilityStatus() {
// TODO(b/281597506): Update the ActivityEmbeddingUtils.isEmbeddingActivityEnabled
// while getting the new API.
return (Utils.isDemoUser(mContext)
&& !ActivityEmbeddingUtils.isEmbeddingActivityEnabled(mContext))
? UNSUPPORTED_ON_DEVICE : AVAILABLE;
}
上面这段代码通过判断条件决定返回值UNSUPPORTED_ON_DEVICE : AVAILABLE,这两个返回值代码不同的意思,并且不仅仅只有这两种返回值,还有以下返回值
- AVAILABLE:表示设置项可用并且在设置页面可见
- AVAILABLE_UNSEARCHABLE:表示设置项可用,但是不能在任何搜索客户端中被搜索到
- CONDITIONALLY_UNAVAILABLE:表示当前不可用,但是未来可能可以使用,不推荐使用此配置,可用DISABLED_FOR_USER或者DISABLED_DEPENDENT_SETTING代替
- UNSUPPORTED_ON_DEVICE:表示此设备不支持该设置,也不会支持该设置,所有指向该设置项的操作都会打开Settings主页
- DISABLED_FOR_USER:表示当前用户无权限修改或使用此设置项
- DISABLED_DEPENDENT_SETTING:表示此设置项依赖于其它功能或配置
方法二:
此方法比较简单粗暴,就是在布局文件中将设置项删除或者注释掉,使代码无法解析到此设置项
方法三
在xml布局文件中,给设置项添加配置
settings:isPreferenceVisible="false"
使设置项不可被搜索到
1
通过Controller中的getAvailabilityStatus()函数的返回值控制设置项是否可被搜索到
@Override
public int getAvailabilityStatus() {
return AVAILABLE_UNSEARCHABLE;
}
2
在xml布局文件中添加上下文
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="top_level_settings">
在设置项的配置中添加以下配置
settings:searchable="false"
3
在fragment中实例化BaseSearchIndexProvider,重写getNonIndexableKeys(),将不能被搜索到的设置项添加到集合中返回出去
public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new SearchIndexProvider(R.xml.network_provider_settings);
@VisibleForTesting
static class SearchIndexProvider extends BaseSearchIndexProvider {
@Override
public List<String> getNonIndexableKeys(Context context) {
final List<String> keys = super.getNonIndexableKeys(context);
keys.add(PREF_KEY_DATA_USAGE);
return keys;
}
}