2011-01-20 39 views
12

我正在使用PreferenceActivity。我如何删除偏好?我似乎无法得到这个工作:如何从PreferenceActivity中删除偏好?

Preference p = findPreference("grok"); 
boolean worked = getPreferenceScreen().removePreference(p); 
// worked == false. 

所以找到了首选项,但removePreference()调用失败。什么是正确的方法来做到这一点?我使用的是preference.xml文件,像这样的按键:

<PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android"> 

    <PreferenceCategory 
     android:title="foo"> 

     <CheckBoxPreference 
      android:key="grok" /> 

      ... 

感谢

回答

28

你只能删除确切孩子PreferenceGroup。所以你的情况,你应该添加一些关键PreferenceCategory(与标题= “富”),然后用此键& findPreference然后将其删除子

XML:

<PreferenceScreen 
xmlns:android="http://schemas.android.com/apk/res/android"> 

<PreferenceCategory 
    android:key="category_foo" 
    android:title="foo"> 

    <CheckBoxPreference 
     android:key="grok" /> 

     ... 

代码:

Preference p = findPreference("grok"); 
// removing Preference 
((PreferenceGroup) findPreference("category_foo")).removePreference(p); 
+0

哎呀,谢谢! – user291701 2011-01-21 02:35:28

3

而不是设置多个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 preferenceParent=preferenceParentTree.get(preferenceToRemove); 
    preferenceGroup.removePreference(preferenceToRemove); 
相关问题