Question

J'étends PreferenceActivity pour mon écran de paramètres. Dans cette activité de préférence, j'ai quelques préférences dont l'une est personnalisée. Le problème est le suivant:

dans cette préférence personnalisée (qui s'étend de ListPreference), je veux pouvoir définir la valeur par défaut, donc je remplace la méthode setDefaultValue(). Dans cette méthode, je fais une analyse pour qu'elle prenne la bonne valeur. Quand j'essaye de lire cette valeur avec la fonction getValue(), il renvoie juste null.

Alors j'ai pensé, ce qui se passe quand je mets juste une valeur codée en dur (vous savez, peut-être que j'ai fait quelque chose de mal, ce ne serait pas la première fois). Eh bien, je récupère toujours le null.

Des idées sur ce que je fais mal?

Modifier:
La définition de defaultValue dans le fichier xml n'est pas vraiment une option car les valeurs ne sont pas connues tant que je ne les récupère pas.

J'ai fait une solution de contournement:

  • Lorsque l'application est lancée pour la première fois: obtenir des données
  • Définissez les valeurs dans la préférence.

De cette façon, je règle la préférence par défaut lorsque je collecte les données

Était-ce utile?

La solution

setDefaultValue ne fonctionne pas comme vous le pensez.Regardez la source de Preference.java et vous découvrirez la logique derrière tout cela.

La meilleure façon de définir une valeur par défaut est de spécifier l'attribut android:defaultValue dans le fichier preferences.xml de votre application.

Autres conseils

J'ai enfin trouvé la solution (quelque part en dehors de StackOverflow, pour une fois).

Lorsque vous créez une classe de préférences personnalisée,

  1. Vous devez implémenter onSetInitialValue comme XåpplI'-I0llwlg'I - l'a souligné
  2. Vous également devez mettre en œuvre onGetDefaultValue(TypedArray a, int index)

Par exemple, si la préférence personnalisée est enregistrée en tant qu'int,

@Override
protected void onSetInitialValue(boolean restore, Object defaultValue) {
    setValue(restore ? getPersistedInt(FALLBACK_DEFAULT_VALUE) : (Integer) defaultValue);
}
@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
   return a.getInteger(index, FALLBACK_DEFAULT_VALUE);
}

Maintenant, PreferenceManager.setDefaultValues() enfin charge également le android:defaultValue pour les préférences personnalisées.Toujours pas de correctif pour les valeurs nulles et false, mais il existe des solutions de contournement pour celles publiées ailleurs.

Si vous voulez appeler getValue() après avoir appelé setDefaultValue() pour récupérer une valeur par défaut la première fois que votre PreferenceActivity s'ouvre, vous devez remplacer onSetInitialValue() dans votre sous-classe Preference. Sinon, la valeur par défaut ne sera pas définie lorsque vous appelez getValue() et elle renverra un null (comme vous l'avez expérimenté).

Par exemple, si votre valeur par défaut est un entier, votre code générique peut ressembler à ceci:

@Override
protected void onSetInitialValue(boolean restore, Object defaultValue)
{
    setValue(restore ? getPersistedInt(DEFAULT_VALUE) : (Integer) defaultValue);
}

onSetInitialValue() est juste une constante privée à l'intérieur de la préférence à utiliser au cas où l'int persistant ne peut pas être récupéré. DEFAULT_VALUE est le setter public pour compléter votre getter public setValue(), et devrait ressembler à ceci:

public int getValue()
{
    return mValue;
}

public void setValue(int value)
{
    if (value != mValue)
    {
        mValue = value;
        persistInt(value);
    }
}

Pour plus d'informations sur getValue(), reportez-vous à la documentation de l'API ici .

C'est également une bonne idée de regarder le code source de la classe Preference ( here ) pour comprendre pourquoi onSetInitialValue() doit être implémenté. En particulier, jetez un œil à onSetInitialValue(), puis regardez setDefaultValue().

Vous pouvez étendre la préférence et définir la valeur par défaut lors de la construction comme ceci:

package com.example.package.preference;

public class CustomPreference extends ListPreference{

public CustomPreference(Context context) {
    super(context);
    init();
}

public CustomPreference(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

private void init() {
    Object anyDefaultValueFromCode = ...
    setDefaultValue(anyDefaultValueFromCode );
}
}

alors vous pouvez l'utiliser à partir de XML comme ceci:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:key="alarm_prefs_screen"
android:title="@string/set_alarm" >

<com.example.package.preference.CustomPreference
    android:key="custom_preference"
    android:title="@string/any_title" />

</PreferenceScreen>

Je pense que cela fonctionne aussi à tout moment.

 Preference aaa = (Preference) findPreference("xxx");
 aaa.setOnPreferenceClickListener(new OnPreferenceClickListener() {

              public boolean onPreferenceClick(Preference preference) {

                    // For edit text preference
                    ((EditTextPreference)preference).getEditText().setText("foobar");


                    // for list preference
                    (ListPreference)preference).setValue("foobar");

                    // etc ...

            return true;
              }
 });

Ce code détectera le moment où la boîte de dialogue est sur le point de se lancer et remplira le EditText ou la liste dans la boîte de dialogue avec votre valeur par défaut.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top