web-dev-qa-db-fra.com

Différence entre DialogPreference avant et après AndroidX

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 ...

17
little_planet

À 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:

Étape 1

L'ancienne classe de dialogue personnalisée (par exemple CustomDialogPreference) basée sur l'ancien DialogPreference doit être divisée en deux classes distinctes:

  1. Une classe (par exemple CustomPreference) doit s'étendre androidx.preference.DialogPreference et ne contiendra que le code lié à la gestion des préférences (gestion des données).
  2. Une autre classe (par exemple CustomDialog) devrait étendre androidx.preference.PreferenceDialogFragmentCompat et ne contiendra que le code lié à la gestion des dialogues (interface utilisateur), y compris onDialogClosed. Cette classe doit exposer une méthode statique newInstance pour renvoyer une instance de cette classe.

Étape 2

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);
        }
    }
18
Livio

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.

0
Androidz