145 votes

Supprimer/masquer une préférence de l'écran

J'ai une activité qui étend PreferenceActivity. Je charge les préférences à partir du fichier xml. Mais dans certains cas, j'ai besoin de masquer complètement 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 complètement cette préférence de l'écran. Est-ce possible ?

219voto

Kavi Points 1593

Si votre Preference se trouve dans un PreferenceCategory vous devez le faire :

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

6 votes

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

177voto

David Hedlund Points 66192

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

myPreferenceScreen.removePreference(myPreference);

0 votes

Super ! Merci ! Fonctionne et est parfaitement logique

0 votes

J'ai peut-être répondu à ma propre question par ce biais ? stackoverflow.com/a/4704360/956975

2 votes

Malheureusement, cela supprime définitivement la préférence. Est-il possible de la masquer ?

53voto

1'' Points 5044

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

4 votes

Cela ne fonctionne 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

1 votes

@MBH : Merci d'avoir mentionné cette mise en garde !

18voto

aaronvargas Points 1881

Si vous utilisez PréférenceFragmentCompat vous pouvez définir la visibilité en xml.

Les préférences dans votre xml seront converties en versions AppCompat automatiquement. Vous pouvez alors utiliser la fonction ' app:isPreferenceVisible dans votre fichier xml

préférences.xml

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <CheckBoxPreference
        android:defaultValue="false"
        android:key="show.navigation"
        android:title="Show navigation"
        app:isPreferenceVisible="false" />

...

Cet attribut est documenté à l'adresse suivante https://developer.Android.com/guide/topics/ui/settings/components-and-attributes

Ajout de PreferenceFragmentCompat est documenté à l'adresse suivante https://developer.Android.com/guide/topics/ui/settings/#inflate_the_hierarchy

Exemple :

public class MySettingsActivity extends AppCompatActivity {

    public static class MySettingsFragment extends PreferenceFragmentCompat {
        @Override
        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
            setPreferencesFromResource(R.xml.preferences, rootKey);
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.settings_container, new MySettingsFragment())
                .commit();
    }
}

9voto

James Points 41

Si vous voulez quelque chose qui change dynamiquement les préférences par exemple sur un SwitchPreference, j'ai trouvé que la meilleure façon est de mettre toutes mes sous-options dans deux conteneurs de catégorie. Au départ, tout est affiché, puis il suffit de retirer les éléments que vous ne voulez pas. L'astuce consiste à déclencher la recréation lorsque quelque chose change et vous n'avez pas à créer manuellement quoi que ce soit ou à vous soucier de remettre les 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 vois, c'est qu'il y a un flash lorsque l'écran est recréé à partir de zéro.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X