如何以编程方式删除PreferenceCategory?

时间:2011-04-09 14:07:18

标签: android preferences

我需要以编程方式删除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);
}

4 个答案:

答案 0 :(得分:63)

您可以通过引用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 name="preferenceScreen" translatable="false">preferenceScreen</string>

代码:

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

然后从PreferenceScreen中删除该类别:

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

答案 1 :(得分:17)

首先不要加载PreferenceCategory

如果您使用Java定义首选项,请不要创建PreferenceCategory

如果要在XML中定义首选项,请使用三个XML文件:

  1. 一个用于此魔法类别之前的东西
  2. 一个魔术类别
  3. 这个神奇类别之后的东西
  4. 在您需要类别的情况下,加载所有三个XML文件。在您不想要类别的情况下,只加载第一个和第三个XML文件。

答案 2 :(得分:8)

为您的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's answer,似乎已过时,但基本相同。

答案 3 :(得分:2)

您可以通过遍历所有首选项找到整个子父树,然后检查哪个是您希望的任何首选项的父项,即使不使用父项的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);

编辑:似乎有一个新的API:

https://developer.android.com/reference/androidx/preference/Preference#setVisible(boolean)

我不确定目前是否可以使用。