如何以编程方式删除PreferenceCategory?

我需要以编程方式删除PreferenceCategory。 我可以用下面的代码删除个人喜好,但我也需要删除(禁用)整个PreferenceCategory。

PreferenceScreen preferenceScreen = getPreferenceScreen(); EditTextPreference etp = (EditTextPreference) preferenceScreen.findPreference("pref22"); ((PreferenceGroup) findPreference("prefcat")).removePreference(etp); 

编辑:这是一个PreferenceCategory“prefcat”和一个子选项“pref22”的工作代码:

 PreferenceScreen preferenceScreen = getPreferenceScreen(); EditTextPreference etp = (EditTextPreference) preferenceScreen.findPreference("pref22"); PreferenceGroup preferenceGroup = (PreferenceGroup) findPreference("prefcat"); if (preferenceGroup != null) { preferenceGroup.removePreference(etp); preferenceScreen.removePreference(preferenceGroup); } 

Solutions Collecting From Web of "如何以编程方式删除PreferenceCategory?"

不要首先加载PreferenceCategory

如果您正在使用Java定义您的首选项,请不要创buildPreferenceCategory

如果您正在使用XML定义您的首选项,请使用三个XML文件:

  1. 一个在这个魔术类之前的东西
  2. 一个为魔术类
  3. 一个用于这个魔术类之后的东西

在需要该类别的情况下,加载全部三个XML文件。 在不需要类别的情况下,只加载第一个和第三个XML文件。

您可以通过参考PreferenceScreen来隐藏类别:

我的你的xml:

 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:key="@string/preferenceScreen"> //set all you values //Preference, PreferenceCategory and/or CheckBoxPreference </PreferenceScreen> 

在你的string.xml中:不要忘了设置这个新的string

  <string name="preferenceScreen">preferenceScreen</string> 

在你的代码中:

 preferenceScreen = (PreferenceScreen) findPreference(getResources().getString(R.string.preferenceScreen)); 

然后从您的PreferenceScreen中删除类别:

 myCategory = (PreferenceCategory) findPreference(getResources().getString(R.string.my_category)); myPreferenceScreen.removePreference(myCategory); 

为您的PreferenceScreen和您的PreferenceCategory提供一个XML关键字:

 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:key="preferenceScreen" > <PreferenceCategory android:summary="@string/settings_billing_summary" android:title="Title" android:key="myPrefCat" > <Preference android:key="someKey" android:summary="Sum" android:title="Title" /> </PreferenceCategory> </PreferenceScreen> 

现在,您可以从您的课程中引用preferenceScreen和preferenceCategory,并使用removePreference()方法从屏幕中删除首选项:

  PreferenceScreen preferenceScreen = (PreferenceScreen) findPreference("preferenceScreen"); PreferenceCategory myPrefCat = (PreferenceCategory) findPreference("myPrefCat"); preferenceScreen.removePreference(myPrefCat); 

这个答案是基于似乎已经过时的douarbou的答案 ,但基本上是一样的。

您可以遍历所有的首选项来查找整个子父树,然后检查哪个是您希望的任何首选项的父项,即使不使用父项的ID:

 public static Map<Preference,PreferenceGroup> buildPreferenceParentTree(final PreferenceActivity activity) { final Map<Preference,PreferenceGroup> result=new HashMap<Preference,PreferenceGroup>(); final Stack<PreferenceGroup> curParents=new Stack<PreferenceGroup>(); curParents.add(activity.getPreferenceScreen()); while(!curParents.isEmpty()) { final PreferenceGroup parent=curParents.pop(); final int childCount=parent.getPreferenceCount(); for(int i=0;i<childCount;++i) { final Preference child=parent.getPreference(i); result.put(child,parent); if(child instanceof PreferenceGroup) curParents.push((PreferenceGroup)child); } } return result; } 

样本用法:

  final Map<Preference,PreferenceGroup> preferenceParentTree=buildPreferenceParentTree(SettingsActivity.this); final PreferenceGroup preferenceGroup=preferenceParentTree.get(preferenceToRemove); preferenceGroup.removePreference(preferenceToRemove);