2011-01-20 30 views
12

Tôi đang sử dụng PreferenceActivity. Làm cách nào để xóa tùy chọn? Tôi dường như không thể làm việc này:Làm cách nào để xóa tùy chọn khỏi PreferenceActivity?

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

Vì vậy, tùy chọn được tìm thấy, nhưng cuộc gọi removePreference() không thành công. Cách thích hợp để làm điều này là gì? Tôi đang sử dụng một tập tin preference.xml cho các phím như sau:

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

    <PreferenceCategory 
     android:title="foo"> 

     <CheckBoxPreference 
      android:key="grok" /> 

      ... 

Cảm ơn

Trả lời

28

bạn có thể loại bỏ đứa con duy nhất chính xác trong PreferenceGroup. Vì vậy, trong trường hợp của bạn, bạn nên thêm một số chìa khóa để PreferenceCategory (với title = "foo"), sau đó findPreference với phím & này sau đó loại bỏ nó con

XML:

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

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

    <CheckBoxPreference 
     android:key="grok" /> 

     ... 

Code:

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

Argh dĩ nhiên, cảm ơn! – user291701

+0

Tôi tò mò, tại sao nó hoạt động trong khi bạn chỉ định một PreferenceCategory trong XML nhưng đưa nó vào một PreferenceGroup trong java? Mã hoạt động theo một trong hai cách, nó có vẻ khó hiểu. – marienke

+1

@marienke nó hoạt động, bởi vì 'PreferenceCategory' là lớp con trực tiếp của' PreferenceGroup', vì vậy nó có nghĩa là 'PreferenceCategory' là' PreferenceGroup' https://developer.android.com/reference/android/preference/PreferenceCategory.html – Attenzione

3

Thay vì đặt nhiều id, bạn có thể lấy toàn bộ tùy chọn và tìm cha mẹ của bất kỳ tùy chọn nào, sau đó xóa bất kỳ tùy chọn nào của con mình:

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; 
    } 

dụ:

final Map<Preference,PreferenceGroup> preferenceParentTree=buildPreferenceParentTree(SettingsActivity.this); 
    final PreferenceGroup preferenceParent=preferenceParentTree.get(preferenceToRemove); 
    preferenceGroup.removePreference(preferenceToRemove); 
Các vấn đề liên quan