设置项--隐藏Settings设置项方法

隐藏设置项

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;
    }
}
  • 13
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值