Nous migrons actuellement vers l'espace de noms Androidx avec notre projet d'application Android. Cependant, j'ai remarqué que non seulement l'espace de noms semble avoir changé. Pour DialogPreference, certaines interfaces qui utilisaient auparavant manquent désormais
Par exemple, les méthodes suivantes semblent être manquantes: onBindDialogView, showDialog, onDialogClosed.
Étant donné que nous utilisons certaines de ces méthodes pour influencer le comportement par défaut de la boîte de dialogue, je ne sais pas comment je devrais réaliser cette fonctionnalité maintenant. Par exemple, nous validons l'entrée avant de fermer la boîte de dialogue, nous enregistrons la valeur dans une base de données au lieu des préférences partagées et ajoutons des éléments dynamiques à la boîte de dialogue.
Quelqu'un d'autre a-t-il déjà rencontré ce problème et trouvé une solution? Ai-je oublié quelque chose dans la documentation? Y a-t-il un autre concept que nous pouvons/devrions utiliser?
Il serait possible d'utiliser des fragments au lieu de DialogPreference mais pour de petites quantités de contenu (par exemple, une liste d'éléments d'arborescence, où l'utilisateur peut choisir), cela semble être une surcharge pour moi ...
À partir des fichiers source androidx, j'ai migré des classes personnalisées basées sur l'ancien DialogPreference vers le nouveau androidx.preference.DialogPreference avec la procédure suivante:
L'ancienne classe de dialogue personnalisée (par exemple CustomDialogPreference) basée sur l'ancien DialogPreference doit être divisée en deux classes distinctes:
Dans les principales préférences de gestion des fragments basées sur PreferenceFragmentCompat la méthode onDisplayPreferenceDialog doit être remplacée pour afficher la boîte de dialogue personnalisée, par exemple:
private static final String DIALOG_FRAGMENT_TAG = "CustomPreference";
@Override
public void onDisplayPreferenceDialog(Preference preference) {
if (getFragmentManager().findFragmentByTag(DIALOG_FRAGMENT_TAG) != null) {
return;
}
if (preference instanceof CustomPreference) {
final DialogFragment f = CustomDialog.newInstance(preference.getKey());
f.setTargetFragment(this, 0);
f.show(getFragmentManager(), DIALOG_FRAGMENT_TAG);
} else {
super.onDisplayPreferenceDialog(preference);
}
}
Un petit hack pour tous ceux qui (comme moi) ne comprennent pas complètement comment combiner androidx.preference.DialogPreference
Et androidx.preference.PreferenceDialogFragmentCompat
:
Étape 1:
Dans la méthode onAttach()
de votre DialogFragment
récupérez la valeur de votre SharedPreference
souhaitée (récupérez la clé soit à partir de la méthode newInstance()
, soit simplement à l'intérieur) et enregistrez en tant que variable. En revanche, enregistrez votre nouvelle valeur dans SharedPreference
avant de fermer votre DialogFragment
. Ce faisant, vous avez créé votre "préférence personnalisée".
Étape 2:
Créez un androidx.preference.DialogPreference
Vide et utilisez-le dans votre PreferenceScreen
. Combinez-le ensuite avec votre DialogFragment
comme décrit dans la 2ème étape par @Livio:
private static final String DIALOG_FRAGMENT_TAG = "CustomPreference";
@Override
public void onDisplayPreferenceDialog(Preference preference) {
if (getFragmentManager().findFragmentByTag(DIALOG_FRAGMENT_TAG) != null) {
return;
}
if (preference instanceof CustomPreference) {
final DialogFragment f = CustomDialog.newInstance(preference.getKey());
f.setTargetFragment(this, 0);
f.show(getFragmentManager(), DIALOG_FRAGMENT_TAG);
} else {
super.onDisplayPreferenceDialog(preference);
}
}
Ce faisant, vous obtiendrez le même résultat avec la seule différence dont vous avez besoin pour gérer SharedPreference
vous-même dans votre DialogFragment
.