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 ?
Réponses
Trop de publicités?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);
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;
}
- 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.
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.
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).
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 !
- Réponses précédentes
- Plus de réponses