移除Setting中不需要的原生功能节点方法分享
原生Setting的界面是使用Preference而不是View来创建的,同时需要特殊的Activity或者Fragment的子类来显示: 如:PreferenceFragment和PreferenceActivity
原生的Setting应用所包含的功能比较全面,但通常开发中总是遇到需要裁剪和定制原生应用的需求,定制需求各有不同,刚接触这类需求时,可能第一时间想到的是屏蔽UI,但在Preference没有类似View那样好用的隐藏方法,这里介绍一下如何删除不需要的功能及子功能。
getPreferenceScreen().removePreference(findPreference("_key"));//删除整个一级节点
((PreferenceGroup)findPreference("_key")).removeAll();//删除该节点下的全部子节点,并保留该节点
((PreferenceGroup)findPreference("_key")).removePreference(findPreference("_key2"));//删除二级子节点
示例代码:版本Android P
main\res\xml\wifi_setting.xml wifi设置界面
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:title="@string/wifi_settings"
settings:keywords="@string/keywords_wifi">
<PreferenceCategory
android:key="connected_access_point"
android:layout="@layout/preference_category_no_label"/>
<PreferenceCategory
android:key="access_points"
android:layout="@layout/preference_category_no_label"/>
<PreferenceCategory
android:key="additional_settings"
android:layout="@layout/preference_category_no_label">
<Preference
android:key="configure_settings"
android:title="@string/wifi_configure_settings_preference_title"
android:fragment="com.android.settings.wifi.ConfigureWifiSettings" />
<Preference
android:key="saved_networks"
android:title="@string/wifi_saved_access_points_label"
android:fragment="com.android.settings.wifi.SavedAccessPointsWifiSettings" />
</PreferenceCategory>
</PreferenceScreen>
main\com\android\settings\wifi\WifiSettings.java wifi设置界面对应java文件
...
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
// TODO(b/37429702): Add animations and preference comparator back after initial screen is
// loaded (ODR).
setAnimationAllowed(false);
addPreferences();
mIsRestricted = isUiRestricted();
/**
* daipi add 删除功能节点
*/
getPreferenceScreen().removePreference(findPreference("additional_settings"));
}
private void addPreferences() {
addPreferencesFromResource(R.xml.wifi_settings);
mConnectedAccessPointPreferenceCategory =
(PreferenceCategory) findPreference(PREF_KEY_CONNECTED_ACCESS_POINTS);
mAccessPointsPreferenceCategory =
(PreferenceCategory) findPreference(PREF_KEY_ACCESS_POINTS);
mAdditionalSettingsPreferenceCategory =
(PreferenceCategory) findPreference(PREF_KEY_ADDITIONAL_SETTINGS);
mConfigureWifiSettingsPreference = findPreference(PREF_KEY_CONFIGURE_WIFI_SETTINGS);
mSavedNetworksPreference = findPreference(PREF_KEY_SAVED_NETWORKS);
Context prefContext = getPrefContext();
mAddPreference = new Preference(prefContext);
mAddPreference.setIcon(R.drawable.ic_menu_add_inset);
mAddPreference.setTitle(R.string.wifi_add_network);
mStatusMessagePreference = new LinkablePreference(prefContext);
mUserBadgeCache = new AccessPointPreference.UserBadgeCache(getPackageManager());
}
...
如示例中删除功能节点注释处的代码,在原生代码添加功能节点后,删除了wifi界面的一个子功能项。
以上就是删除Preference功能节点的方法,其他功能界面同样找到不需要的功能key,按上述方法删除即可。