2011-01-20 15 views
12

私はPreferenceActivityを使用しています。環境設定を削除するにはどうすればよいですか?PreferenceActivityから環境設定を削除するには?

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

したがって、preferenceが見つかりましたが、removePreference()呼び出しが失敗しました。これを行う正しい方法は何ですか?私はそうのようなキーのpreference.xmlファイルを使用しています:

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

    <PreferenceCategory 
     android:title="foo"> 

     <CheckBoxPreference 
      android:key="grok" /> 

      ... 

おかげ

答えて

28

をあなたはPreferenceGroupにのみ正確な子を削除することができます。

<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); 
だからあなたの場合には、あなたが(タイトル= "foo" という付き)PreferenceCategoryにいくつかのキーを追加する必要があり、このキー&とfindPreferenceは、子

XMLをそれを削除します

+0

なんてこった、ありがとう! – user291701

+0

私は不思議ですが、XMLでPreferenceCategoryを指定しているのにJavaのPreferenceGroupにキャストしているのはなぜですか?コードはいずれの方法でも動作しますが、混乱するだけです。 – marienke

+1

@marienke 'PreferenceCategory'は' PreferenceGroup'の直接サブクラスなので、 'PreferenceCategory'は' PreferenceGroup'です。 https://developer.android.com/reference/android/preference/PreferenceCategory.html – Attenzione

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