Android 如何以编程方式删除PreferenceCategory?

Android 如何以编程方式删除PreferenceCategory?,android,preferences,Android,Preferences,我需要以编程方式删除PreferenceCategory。我可以用下面的代码删除个人偏好,但我也需要删除(禁用)整个偏好类别 PreferenceScreen preferenceScreen = getPreferenceScreen(); EditTextPreference etp = (EditTextPreference) preferenceScreen.findPreference("pref22"); ((PreferenceGroup) findPreference("pref

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

PreferenceScreen preferenceScreen = getPreferenceScreen();
EditTextPreference etp = (EditTextPreference) preferenceScreen.findPreference("pref22");
((PreferenceGroup) findPreference("prefcat")).removePreference(etp);
编辑:以下是首选项类别“prefcat”和子首选项“pref22”的工作代码:


首先不要加载
首选项类别

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

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

  • 一个是这个魔法类别之前的东西
  • 一个是魔法类
  • 一个是这个魔法类别之后的东西

  • 在需要类别的情况下,加载所有三个XML文件。在不需要类别的情况下,只加载第一个和第三个XML文件。

    您可以通过获取对
    首选项屏幕的引用来隐藏类别:

    我需要您的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>
    
    然后从首选项屏幕中删除该类别:

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

    您可以通过遍历所有首选项,然后检查哪一个是您想要的任何首选项的父级,甚至不使用父级的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;
        }
    
    public静态映射buildPreferenceParentTree(最终首选项活动)
    {
    最终映射结果=新HashMap();
    最终堆栈curParents=新堆栈();
    curParents.add(activity.getPreferenceScreen());
    而(!curParents.isEmpty())
    {
    最终首选项组父项=curParents.pop();
    final int childCount=parent.getPreferenceCount();
    
    对于(int i=0;i以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>
    

    这个答案的依据似乎是过时的,但基本上是相同的。

    非常感谢。我会这样做。只是为了记录:无法删除通过编程方式从XML加载的PreferenceCategory?@hjw:我没有尝试过。我认为
    removePreference()
    对该类别有效,但我认为您已经尝试过了。此外,如果您不需要它,为什么要首先加载它?是的,您可以使用removePreference()@Commonware,除了制作三个文件之外,还有其他方法可以在运行时删除类别吗?@commonware-FYI-我制作了一个示例项目,演示如何通过编程方式添加和删除首选类别。这并不太糟糕,让我们利用安卓提供的功能,但仍然保持良好和灵活!我不清楚什么这里是关于PreferenceCategory的问题,但您的解决方案涉及删除preferenceGroup。我有同样的情况……为了澄清,我的XML列出了PreferenceCategory,但我要删除该标题/组,我完全按照您在上面所做的那样,通过编程方式使用PreferenceGro检索对我的PreferenceCategory的引用向上声明。希望这对其他人有帮助。哦,很久以前。如果你看代码,你会看到类别被强制转换为首选项组。使用首选项组对我不起作用,但强制转换为首选项组对我起作用。这应该选作答案。使用
    myPreferenceScreen.removePreference(myCategory);
    因为
    remove()
    首选项屏幕上的方法不存在
    myCategory = (PreferenceCategory) findPreference(getResources().getString(R.string.my_category));
    myPreferenceScreen.removePreference(myCategory);
    
    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);
    
    <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 preferenceScreen = (PreferenceScreen) findPreference("preferenceScreen");
        PreferenceCategory myPrefCat = (PreferenceCategory) findPreference("myPrefCat");
        preferenceScreen.removePreference(myPrefCat);