2010-02-10 8 views
112

J'ai une activité qui étend PreferenceActivity. Je charge les préférences du fichier XML. Mais dans certains cas, j'ai besoin de masquer complètement l'une des préférences de l'écran en fonction de l'état de mon application. Il existe une méthode setEnabled, mais ce n'est pas exactement ce que je veux. Je veux supprimer cette préférence de l'écran complètement. Est-ce possible?Supprimer/masquer une préférence de l'écran

+1

Je suis curieux de savoir aussi. –

Répondre

153

Oui, si vous avez une référence à la fois la Preference, et son parent (un PreferenceCategory ou PreferenceScreen)

myPreferenceScreen.removePreference(myPreference); 
+0

merci - fonctionne totalement. –

+0

Génial! Merci!Fonctionne et fait parfaitement sens – Bostone

+0

J'ai peut-être répondu à ma propre question à travers cela? http://stackoverflow.com/a/4704360/956975 – marienke

180

Si votre Preference est dans un PreferenceCategory, vous devez faire ceci:

XML:

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

<CheckBoxPreference 
    android:key="checkPref" /> 

Java:

CheckBoxPreference mCheckBoxPref = (CheckBoxPreference) findPreference("checkPref"); 
PreferenceCategory mCategory = (PreferenceCategory) findPreference("category_foo"); 
mCategory.removePreference(mCheckBoxPref); 
+2

Pour être juste, la réponse ci-dessus dit que vous avez besoin du parent 'PreferenceCategory'. – matt

43

Dans le cas où la préférence est un enfant direct de l'écran de préférence, voici un code autonome:

PreferenceScreen screen = getPreferenceScreen(); 
Preference pref = getPreferenceManager().findPreference("mypreference"); 
screen.removePreference(pref); 
+3

Cela ne fonctionnera pas si la préférence est située dans la catégorie. vous devez 'findPreference' pour la catégorie, et supprimer la préférence de la catégorie – MBH

+1

@MBH: Merci de mentionner cette mise en garde! –

7

Si vous voulez quelque chose qui va changer dynamiquement les prefs par exemple sur un SwitchPreference , J'ai trouvé que le meilleur moyen est de mettre toutes mes options secondaires dans des conteneurs de deux catégories. Au départ, vous aurez tout montré, alors vous supprimez simplement les bits que vous ne voulez pas. Le peu intelligent, est-ce que vous déclenchez juste recréer quand quelque chose change et alors vous ne devez pas créer manuellement n'importe quoi ou vous inquiétez de remettre des choses dans le bon ordre.

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    addPreferencesFromResource(R.xml.preferences); 
    PreferenceCategory prefCatOne= (PreferenceCategory)findPreference("prefCatOne"); 
    PreferenceCategory prefCatTwo= (PreferenceCategory)findPreference("prefCatTwo"); 
    SwitchPreference mySwitchPref= (SwitchPreference)findPreference("mySwitchPref"); 
    PreferenceScreen screen = getPreferenceScreen(); 
    if (mySwitchPref.isChecked()) { 
    screen.removePreference(prefCatOne); 
    } else { 
    screen.removePreference(prefCatTwo); 
    } 
} 

public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { 
    if (key.equals("mySwitchPref")) { 
     this.recreate(); 
    } 
} 

Le seul inconvénient que je peux voir avec cela, est il y a un flash que l'écran est recréé à partir de zéro.

+0

Le cas ne fonctionne pas, au moins pas dans 22. Mais le changer en une préférence (même si c'est un groupe de préférences) fonctionne. – Rob

+0

Rob, je viens de tester le code ci-dessus dans un API22 AVD et ça marche très bien. Assurez-vous que votre contenu XML de préférence correspond à votre code. Pour l'exemple ci-dessus, SwitchPreference peut être n'importe où, mais vous avez besoin que les PreferenceCategorys soient des enfants directs de PreferenceScreen. – James

+0

Je viens de recevoir la catégorie comme une préférence, pas de distribution, et l'ai enlevée. Travaillé. – Rob

0

Si vous souhaitez évaluer, et en fonction de ce masque, une alternative peut être/(Si deseas evaluar, y en base un ocultar de eso, una alternativa puede ser):

SwitchPreference autenticacionUsuario = (SwitchPreference) findPreference("key_autenticacion_usuario"); 

final EditTextPreference Username = (EditTextPreference) findPreference("key_username_mqtt"); 
      final EditTextPreference Password = (EditTextPreference) findPreference("key_password_mqtt"); 

if (!autenticacionUsuario.isChecked()) { 
       PreferenceCategory preferenceCategory = (PreferenceCategory) findPreference("category_mqtt"); 
        preferenceCategory.removePreference(Username); 
        preferenceCategory.removePreference(Password); 
      } 

Tout cela doit être à l'intérieur/(Todo esto debe ir Dentro):

PrefsFragment de public static class étend PreferenceFragment {

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
+1

Désolé, mais il s'agit d'un site en anglais. Pouvez-vous répondre en anglais? –

+0

Bien sûr, mon intention était également de fournir des personnes qui ne parlent pas anglais –

+1

@GustavoEduardoBelduma alors vous pourriez avoir besoin de lire ceci http://meta.stackoverflow.com/a/297680/545026 –

0

Voici une manière générique pour le faire qui fonctionne indépendamment du fait que la préférence est sous PreferenceCategory ou PreferenceScreen.

private void removePreference(Preference preference) { 
    PreferenceGroup parent = getParent(getPreferenceScreen(), preference); 
    if (parent == null) 
     throw new RuntimeException("Couldn't find preference"); 

    parent.removePreference(preference); 
} 

private PreferenceGroup getParent(PreferenceGroup groupToSearchIn, Preference preference) { 
    for (int i = 0; i < groupToSearchIn.getPreferenceCount(); ++i) { 
     Preference child = groupToSearchIn.getPreference(i); 

     if (child == preference) 
      return groupToSearchIn; 

     if (child instanceof PreferenceGroup) { 
      PreferenceGroup childGroup = (PreferenceGroup)child; 
      PreferenceGroup result = getParent(childGroup, preference); 
      if (result != null) 
       return result; 
     } 
    } 

    return null; 
} 
2

Dans votre fichier XML:

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

<PreferenceCategory 
android:key="personalisation" 
android:title="your title here"> 

<ThemedPreference 
android:key="animation" /> 

</PreferenceScreen> 

Dans votre code:

PreferenceScreen pPreferenceScreen = (PreferenceScreen) findPreference("preferenceScreen"); 

PreferenceCategory pCategory = (PreferenceCategory) findPreference("personalisation"); 
ThemedPreference pThemePref = (ThemedPreference) findPreference("animation"); 

pPreferenceScreen.removePreference(pCategory); //remove category 
pCategory.removePreference(pThemePref); // remove preference 
Questions connexes