2011-01-20 46 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); 
相關問題