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 ?

8voto

user3165739 Points 136

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

7voto

Tea Points 136

Je recommande d'utiliser la préférence v7, elle a setVisible() méthode. Mais je ne l'ai pas encore essayé. En conséquence, vous devez utiliser PreferenceFragment au lieu de PreferenceActivity .

3voto

Al Ro Points 91

Dans le fichier XML, vous pouvez créer une préférence cachée en laissant les balises title et summary vides.

<EditTextPreference
    android:defaultValue="toddlerCam"
    android:key="save_photo_dir"
/>

3voto

birdy Points 2521

Depuis l'API 26 d'Android getParent() est disponible : [https://developer.Android.com/reference/Android/preference/Preference.html#getParent()](https://developer.android.com/reference/android/preference/Preference.html#getParent())

Cependant, vous pouvez faire ce qui suit :

preference.getParent().removePreference(preference);

2voto

Sam Points 3542

Voici une méthode générique qui fonctionne indépendamment du fait que la préférence se trouve dans un fichier PreferenceCategory o 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;
}

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