Comment afficher et cacher les préférences sur Android dynamiquement?

Est-il un moyen dynamique d'afficher et de masquer des préférences? Dans mon cas, j'ai une préférence de case à cocher qui désactiverait ou activerait l'un des deux groupes de préférence ("avec-" et "sans-handicap"). Alors que ce serait l'idéal GUI dans un environnement de bureau, "avec un handicap" prend presque la totalité de l'écran, tandis que l'autre, "sans-handicap" n'occupe qu'une petite partie de l'écran.

plutôt que de montrer les deux groupes en même temps, je voudrais montrer seulement un des ils sont à la fois, et montrent ou cachent dynamiquement les 2 groupes lorsque la case à cocher change. Est-il un moyen de faire cela?

25
demandé sur spaaarky21 2011-01-16 05:54:58

6 réponses

From a preference activity call

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

vous pouvez appeler plus tard:

preferenceScreen.addPreference(somePreference);

La seule un peu plus compliqué est d'obtenir l'ordre correct lors de l'ajout de nouveau. Regardez PreferenceScreen la documentation, en particulier de la classe de base, PreferenceGroup pour plus de détails.

55
répondu dhaag23 2011-01-16 07:51:26

pas exactement cacher / afficher mais si vous voulez seulement Désactiver / Activer la 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
répondu hidro 2015-10-08 10:46:03

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

1
répondu Tea 2017-06-09 11:12:48

si vous voulez implémenter la dissimulation de la préférence complètement dans la préférence, voici un exemple. Ne permet pas de rendre à nouveau visible.

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
répondu digitalfootmark 2017-04-28 10:15:22

j'avais besoin de quelque chose de similaire: activer un commutateur pour masquer ou afficher deux Préférences supplémentaires. Consultez l'application exemple de Android-Support-De Préférence-V7-Fix qui apporter quelques nouveaux types de préférences et résout certains problèmes de la bibliothèque officielle. Il y a un exemple pour cocher une case pour afficher ou masquer une catégorie de préférence.

dans le fragment qui s'é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 types de préférences qui sont cachés lors de l' pref_show_extra_stuff est activée.

0
répondu adriennoir 2018-01-05 10:40:11

pour masquer les préférences dynamiquement, j'ai créé une condition if sur la valeur de laquelle je décide si je veux que le pref montre ou non. Pour faire le cacher, j'ai été en utilisant:

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

le plus délicat est de le rendre visible à nouveau. Il n'y a aucun moyen direct de le faire, sauf de recréer le plan. Si la valeur de la condition if-est false, ce qui signifie que le pref doit être visible, alors le code pour masquer le pref ne sera jamais exécuté, résultant ainsi en un pref visible. Voici comment recréer la mise en page (dans mon cas, je suis de l'extension d'une PreferencesListFragment):

    getActivity().recreate();

j'espère que cela a été utile.

0
répondu Marline 2018-05-10 22:43:58