Android12 管控Settings页面子项目功能(点击进不去)

243 阅读1分钟

Android12 Settings页面子项目管控

Settings一级菜单加载的xml文件路径和源码如下(部分源码)

\packages\apps\Settings\res\xml\top_level_settings.xml

<Preference
    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:controller="com.android.settings.network.TopLevelNetworkEntryPreferenceController"/>
<Preference
    android:fragment="com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment"
    android:icon="@drawable/ic_devices_other"
    android:key="top_level_connected_devices"
    android:order="-140"
    android:title="@string/connected_devices_dashboard_title"
    android:summary="@string/connected_devices_dashboard_default_summary" settings:controller="com.android.settings.connecteddevice.TopLevelConnectedDevicesPreferenceController"/>
<Preference
    android:key="top_level_smartcontrols"
    android:title="@string/smart_controls"
    android:icon="@drawable/ic_smart_controls"
    android:order="-15"
    android:fragment="com.unisoc.settings.smartcontrols.SmartControlsSettings"
    settings:controller="com.unisoc.settings.smartcontrols.TopLevelSmartControlsPreferenceController"/>

每个Preference都是一级菜单的子项目,每个fragment是继承DashboardFragment,如果子类没写onPreferenceTreeClick方法的话,点击某个菜单项后(一级,二级,三级)都会执行DashboardFragment.java里的 onPreferenceTreeClick方法,不return super.onPreferenceTreeClick(preference);就可以拦截点击后的跳转(同理,二级跳三级也可),路径和源码如下: \packages\apps\Settings\src\com\android\settings\dashboard\DashboardFragment.java

public boolean onPreferenceTreeClick(Preference preference) {
        final Collection<List<AbstractPreferenceController>> controllers =
                mPreferenceControllers.values();

        for (List<AbstractPreferenceController> controllerList : controllers) {
            for (AbstractPreferenceController controller : controllerList) {
                if (controller.handlePreferenceTreeClick(preference)) {
                    // log here since calling super.onPreferenceTreeClick will be skipped
                    writePreferenceClickMetric(preference);
                    return true;
                }
            }
        }
        return super.onPreferenceTreeClick(preference);
    }