2011-01-20 11 views
12

Estoy usando PreferenceActivity. ¿Cómo elimino una preferencia? Parece que no puedo hacer que esto funcione:¿Cómo eliminar una preferencia de PreferenceActivity?

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

Así que se encuentra la preferencia, pero la llamada removePreference() falla. ¿Cuál es la forma correcta de hacer esto? Estoy usando un archivo preference.xml de las teclas, así:

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

    <PreferenceCategory 
     android:title="foo"> 

     <CheckBoxPreference 
      android:key="grok" /> 

      ... 

Gracias

Respuesta

28

puede quitar único hijo exacta en PreferenceGroup. Así, en su caso, usted debe agregar algo clave para PreferenceCategory (con título = "foo"), entonces findPreference con esta clave & posteriormente retirarlo niño

XML:

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

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

    <CheckBoxPreference 
     android:key="grok" /> 

     ... 

Código:

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

Argh por supuesto, gracias! – user291701

+0

Tengo curiosidad, ¿por qué funciona mientras especificas una PreferenceCategory en el XML pero la echas a un PreferenceGroup en el java? El código funciona de cualquier manera, simplemente parece confuso. – marienke

+1

@marienke funciona, porque 'PreferenceCategory' es una subclase directa de' PreferenceGroup', por lo que significa que 'PreferenceCategory' es' PreferenceGroup' https://developer.android.com/reference/android/preference/PreferenceCategory.html – Attenzione

3

En lugar de establecer múltiples identificadores, puede obtener el árbol de preferencias completo y buscar el elemento primario de cualquier preferencia, y luego eliminar cualquiera de sus preferencias secundarias:

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

ejemplo:

final Map<Preference,PreferenceGroup> preferenceParentTree=buildPreferenceParentTree(SettingsActivity.this); 
    final PreferenceGroup preferenceParent=preferenceParentTree.get(preferenceToRemove); 
    preferenceGroup.removePreference(preferenceToRemove); 
Cuestiones relacionadas