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 ?

0voto

Si vous voulez évaluer, et sur la base de ce masque, une alternative peut être

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 se faire dans le cadre

public static class PrefsFragment extends PreferenceFragment {

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

0voto

android developer Points 20939

Vous pouvez le faire de deux manières :

Si vous utilisez la bibliothèque de support, vous pouvez construire une carte de l'arbre des préférences et de leurs parents, puis supprimer une préférence en utilisant son parent. Voici une fonction pour générer une telle carte :

public static Map<Preference, PreferenceGroup> buildPreferenceParentTree(@NonNull final PreferenceScreen preferenceScreen) {
    final Map<Preference, PreferenceGroup> result = new HashMap<>();
    final Stack<PreferenceGroup> curParents = new Stack<>();
    curParents.add(preferenceScreen);
    while (!curParents.isEmpty()) {
        final PreferenceGroup parent = curParents.pop();
        final int childCount = parent.getPreferenceCount();
        for (int i = 0; i < childCount; ++i) {
            final Preference child = parent.getPreference(i);
            result.put(child, parent);
            if (child instanceof PreferenceGroup)
                curParents.push((PreferenceGroup) child);
        }
    }
    return result;
}
  1. Si vous utilisez la nouvelle API de préférences d'Android-x, vous pouvez simplement définir la visibilité, en utilisant la commande setVisible sur celui-ci.

0voto

RCB Points 146

Si vous faites ce que je pense que vous essayez de faire (parce que j'essaie de le faire maintenant), il serait peut-être préférable d'activer/désactiver la préférence. En effet, si vous la supprimez, elle est retirée de l'écran des préférences et vous risquez de ne pas pouvoir la remettre à l'endroit voulu si vous créez l'écran par programme.

pref.setEnabled(false) ; pref.setEnabled(true) ;

bien que cela puisse être déprécié. Cela fonctionne pour le cas d'utilisation que je suis en train de faire en ce moment.

0voto

Saksham Khurana Points 112

Si tout ce dont vous avez besoin est de ne pas afficher la préférence, c'est-à-dire de la masquer, procédez comme suit

findPreference<Preference>("keyName").isVisible = false

le code est en kotlin

Note : Il s'agit des préférences AndroidX (je ne sais pas si la même chose se passe avec les préférences précédentes).

0voto

TwiXter Points 19

Il existe une solution de contournement simple :

//In your Activity code after finding the preference to hide:
    if(pref!=null) {
        pref.setEnabled(false);
        pref.setSelectable(false);
        //Following line will replace the layout of your preference by an empty one
        pref.setLayoutResource(R.layout.preference_hidden);
    }

Et créez une disposition preference_hidden :

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="0dp"/>

Où que soit votre préférence pour cacher (dans un PreferenceGroup ou à la racine), cela fonctionnera !

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