38 votes

Une façon concise d'écrire de nouvelles classes DialogPreference ?

Je suis en train d'écrire des boîtes de dialogue de préférences personnalisées dans Android en étendant la fonction DialogPreference classe. Cependant, je m'inquiète un peu de la quantité de code standard nécessaire pour cela, car il semble y avoir beaucoup de comportements à tester.

Par exemple, cet exemple de dialogue de préférence numérique est assez typique : http://svn.jimblackler.net/jimblackler/trunk/workspace/NewsWidget/src/net/jimblackler/newswidget/NumberPreference.java

En particulier, le onSave() / RestoreInstanceState() et les parties "class SavedState", qui sont nécessaires pour que les modifications actuelles de la boîte de dialogue soient conservées lors des changements d'orientation, sont assez verbeuses et complexes.

Quelqu'un a-t-il des conseils pour écrire des classes DialogPreference de manière plus concise ?

138voto

Roy Sharon Points 1441

Le strict minimum est :

  1. MyCustomDialogPreference(Context context, AttributeSet attrs) constructeur.
    • N'oubliez pas d'appeler super(context, attrs) .
    • Appelez setPersistent(false) pour indiquer à la super classe de préférence que vous maintenez la valeur de préférence par vous-même.
    • Si vous souhaitez gonfler la mise en page du panneau de dialogue à partir d'une ressource, appelez également la fonction setDialogLayoutResource(int dialogLayoutResId) .
  2. onBindDialogView(View view) - mettez à jour la vue avec la ou les valeurs de votre choix.
    • N'oubliez pas d'appeler super.onBindDialogView(view) .
  3. onDialogClosed(boolean positiveResult) - si positiveResult est vrai, persistez la ou les valeurs de votre vue dans les préférences partagées.
    • N'oubliez pas d'appeler super.onDialogClosed(positiveResult) .

C'était le strict minimum, et ça le suppose :

  • Votre DialogPreference personnalisé gère une seule paire clé/valeur de préférence.
  • Vous êtes responsable de la persistance de la valeur de préférence.
  • Vous gonflez la mise en page du panneau de dialogue à partir d'une ressource.

Maintenant, quelques options supplémentaires :

(a) Si vous voulez créer la mise en page du panneau de dialogue de manière programmatique, implémentez aussi onCreateDialogView() au lieu d'appeler setDialogLayoutResource() dans le constructeur.

(b) Si votre préférence ne prend en charge qu'une seule paire clé/valeur, vous pouvez utiliser les méthodes d'enregistrement d'aide persistBoolean(boolean), persistFloat(float), persistInt(int), persistLong(long), persistString(String) lorsque vous faites persister la valeur de préférence modifiée dans onDialogClosed(). Sinon, vous devez utiliser la méthode getEditor() comme suit :

private MyCustomView myView;

@Override
protected void onBindDialogView(View view) {
    super.onBindDialogView(view);

    // the view was created by my custom onCreateDialogView()
    myView = (MyCustomView)view;

    SharedPreferences sharedPreferences = getSharedPreferences();
    myView.setValue1(sharedPreferences.getString(myKey1, myDefaultValue1));
    myView.setValue2(sharedPreferences.getString(myKey2, myDefaultValue2));
}

@Override
protected void onDialogClosed(boolean positiveResult) {
    super.onDialogClosed(positiveResult);

    if (positiveResult) {
        Editor editor = getEditor();
        editor.putString(myKey1, myView.getValue1());
        editor.putString(myKey2, myView.getValue2());
        editor.commit();
    }
}

(c) Si vous prévoyez de fournir des valeurs par défaut à partir d'un xml gonflé, vous devez également implémenter la fonction onGetDefaultValue(TypedArray a, int index) méthode.


@RichardNewton, je sais qu'un mois s'est écoulé depuis que vous avez posé la question. J'espère que vous pouvez encore l'utiliser.

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