web-dev-qa-db-fra.com

Comment afficher et masquer les préférences sur Android de manière dynamique?

Existe-t-il un moyen d'afficher et de masquer de manière dynamique les préférences? Dans mon cas, j'ai une préférence de case à cocher qui désactive ou active l'un des 2 groupes de préférences (groupes "avec" et "sans handicap"). Bien que ce soit l'interface graphique idéale dans un environnement de bureau, le "avec handicap" occupe presque tout l'écran, tandis que l'autre, "sans handicap" n'en occupe qu'une petite partie.

Plutôt que de montrer les deux groupes en même temps, j'aimerais afficher un seul groupe à la fois et afficher ou masquer de manière dynamique les 2 groupes lorsque la case à cocher change. Y a-t-il un moyen de faire cela?

27
Japtar

A partir d'un appel PreferenceActivity

Preference somePreference = findPreference(SOME_PREFERENCE_KEY);
PreferenceScreen preferenceScreen = getPreferenceScreen();
preferenceScreen.removePreference(somePreference);

vous pouvez appeler plus tard:

preferenceScreen.addPreference(somePreference);

La seule partie un peu délicate consiste à obtenir le bon ordre lors de l'ajout. Regardez la documentation PreferenceScreen , en particulier sa classe de base, PreferenceGroup pour plus de détails.

Remarque: Ce qui précède ne fonctionne que pour les enfants immédiats d'un PreferenceScreenname__. S'il existe un PreferenceCategoryentre les deux, vous devez supprimer la préférence de son parent PreferenceCategoryname__, et non du PreferenceScreenname__. Tout d'abord, assurez-vous que PreferenceCategorya un attribut Android:key défini dans le fichier XML. Ensuite:

Preference somePreference = findPreference(SOME_PREFERENCE_KEY);
PreferenceCategory preferenceCategory = (PreferenceCategory) findPreference(SOME_PREFERENCE_CATEGORY_KEY);
preferenceCategory.removePreference(somePreference);

et:

preferenceCategory.addPreference(somePreference);
57
dhaag23

Je recommande d'utiliser Préférence V7 , la méthode setVisible(). Mais je n'ai pas encore essayé.

2
Tea

Vous ne pouvez pas masquer/afficher, mais si vous souhaitez uniquement désactiver/activer une préférence en fonction d'une autre préférence, vous pouvez spécifier Android:dependency="preferenceKey" ou Preference.setDependency(String)

Exemple de developer.Android.com :

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <CheckBoxPreference
        Android:key="pref_sync"
        Android:title="@string/pref_sync"
        Android:summary="@string/pref_sync_summ"
        Android:defaultValue="true" />
    <ListPreference
        Android:dependency="pref_sync"
        Android:key="pref_syncConnectionType"
        Android:title="@string/pref_syncConnectionType"
        Android:dialogTitle="@string/pref_syncConnectionType"
        Android:entries="@array/pref_syncConnectionTypes_entries"
        Android:entryValues="@array/pref_syncConnectionTypes_values"
        Android:defaultValue="@string/pref_syncConnectionTypes_default" />
</PreferenceScreen>
2
hidro

Pour masquer les préférences de manière dynamique, j'ai créé une condition if à la valeur de laquelle je décide si je veux que le préf soit affiché ou non. Pour faire la cachette réelle, j'ai utilisé:

    findPreference(getString(R.string.pref_key)).setLayoutResource(R.layout.hidden);

La difficulté consiste à le rendre visible à nouveau. Il n'y a pas de moyen direct de le faire, sauf de recréer la mise en page. Si la valeur de la condition if est false, ce qui signifie que le préf doit être visible, le code permettant de masquer le préf ne sera jamais exécuté, ce qui donnera un préf visible. Voici comment recréer la mise en page (dans mon cas, j'étends un fichier PreferencesListFragment):

    getActivity().recreate();

J'espère que c'était utile. 

0
Marline

Si vous souhaitez implémenter complètement le masquage de la préférence dans la préférence, voici un exemple. Ne permet pas de le rendre à nouveau visible, cependant.

public class RemovablePreference extends Preference {

@Override
protected void onBindView(View view) {
    super.onBindView(view);

    updateVisibility(); // possibly a better place available?
}

private void updateVisibility() {
    Context context = getContext(); // should be a PreferenceActivity
    if (context instanceof PreferenceActivity) {
        updateVisibility((PreferenceActivity)context);
    }
}

private void updateVisibility(PreferenceActivity activity) {
    updateVisibility(getPreferenceScreen(activity));
}

private PreferenceScreen getPreferenceScreen(PreferenceActivity activity) {

    if (activity.getPreferenceScreen() != null) {
        return activity.getPreferenceScreen(); // for old implementations
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        Fragment fragment = activity.getFragmentManager().findFragmentById(Android.R.id.content);
        if (fragment instanceof PreferenceFragment) {
            return ((PreferenceFragment) fragment).getPreferenceScreen();
        }
    }
    return null;
}

private void updateVisibility(PreferenceScreen screen) {
    if (!isVisible() && screen != null) {
        hidePreference(screen, this);
    }
}

private boolean hidePreference(PreferenceGroup prefGroup, Preference removedPreference) {
    boolean removed = false;

    if (prefGroup.removePreference(removedPreference)) {
        removed = true;
    }

    for (int i = 0; i < prefGroup.getPreferenceCount(); i++) {
        Preference preference = prefGroup.getPreference(i);
        if (preference instanceof PreferenceGroup) {
            PreferenceGroup prefGroup2 = (PreferenceGroup)preference;
            if (hidePreference(prefGroup2, this)) {
                // The whole group is now empty -> remove also the group
                if (prefGroup2.getPreferenceCount() == 0) {
                    removed = true;
                    prefGroup.removePreference(prefGroup2);
                }
            }
        }
    }

    return removed;
}

protected boolean isVisible() {
    return true; // override
}
0
digitalfootmark

J'avais besoin de quelque chose de similaire: basculer un commutateur pour masquer ou afficher deux préférences supplémentaires. Découvrez l'exemple d'application depuis Android-Support-Preference-V7-Fix qui apporte de nouveaux types de préférences et corrige des problèmes liés à la bibliothèque officielle. Voici un exemple pour cocher une case afin d'afficher ou de masquer une catégorie de préférence.

Dans le fragment qui étend PreferenceFragmentCompatDividers, vous pouvez utiliser quelque chose comme:

findPreference("pref_show_extra_stuff").setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
            findPreference("pref_extra_stuff_01").setVisible((Boolean) newValue);
            findPreference("pref_extra_stuff_02").setVisible((Boolean) newValue);
            return true;
        }
    });

pref_extra_stuff_01 et pref_extra_stuff_02 sont les deux préférences masquées lors du basculement de pref_show_extra_stuff .

0
adriennoir