Domanda

Mi sto estendendo PreferenceActivity Per la mia schermata di impostazioni. In questa attività di preferenza ho un paio di preferenze una delle quali è fatta su misura. Il problema è il seguente:

in questa preferenza personalizzata (che si estende da ListPreference) Voglio essere in grado di impostare il valore predefinito, quindi prevalere setDefaultValue() metodo. In questo metodo faccio un po 'di analisi in modo che richieda il valore corretto. Quando sto cercando di leggere questo valore con il getValue() funzione restituisce solo null.

Quindi ho pensato, cosa succede quando ho appena messo un valore hardcoded lì dentro (sai, forse ho fatto qualcosa di sbagliato, non sarebbe stato la prima volta). Bene, ottengo ancora null Indietro.

Qualche idea su cosa sto facendo di sbagliato?

Modificare:
L'impostazione del valore predefinito nel file XML non è davvero un'opzione perché i valori non sono noti fino a quando non li recupero.

Ho fatto una soluzione alternativa:

  • Quando l'app viene avviata per la prima volta: ottenere dati
  • Imposta i valori nella preferenza.

In questo modo ho impostato la preferenza predefinita quando raccolgo i dati

È stato utile?

Soluzione

setDefaultValue Non funziona come pensi che lo faccia. Guarda a la fonte di Preference.java E farai la logica dietro tutto.

Il modo preferito per impostare un valore predefinito è specificare il android:defaultValue attributo nel preferences.xml file della tua app.

Altri suggerimenti

Finalmente ho trovato la soluzione (Da qualche parte oltre a Stackoverflow, per una volta).

Quando si crea una classe di preferenza personalizzata,

  1. Devi implementare onSetInitialValue come Xåppli' -i0llwlg'i - sottolineato
  2. Voi anche bisogno di implementare onGetDefaultValue(TypedArray a, int index)

Ad esempio, se la preferenza personalizzata viene salvata come 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);
}

Adesso PreferenceManager.setDefaultValues() finalmente carica il android:defaultValue Anche per le preferenze personalizzate. Ancora nessuna correzione per nulls e false, ma ci sono soluzioni alternative per quelle pubblicate altrove.

Se vuoi chiamare getValue() Dopo aver chiamato setDefaultValue() Per recuperare un valore predefinito la prima volta che si apre la tua preferenceattività, è necessario sovrascrivere onSetInitialValue() Nella sottoclasse preferenza. Altrimenti, il valore predefinito non verrà impostato quando si chiama getValue() e restituirà un file null (come hai vissuto).

Ad esempio, se il valore predefinito è un numero intero, il tuo onSetInitialValue() Potrebbe sembrare questo:

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

DEFAULT_VALUE è solo una costante privata all'interno della preferenza da utilizzare nel caso in cui l'int non può essere recuperato. setValue() è il setter pubblico per integrare il tuo getValue() public getter, e dovrebbe assomigliare a questo:

public int getValue()
{
    return mValue;
}

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

Per ulteriori informazioni su onSetInitialValue(), fare riferimento alla documentazione API qui.

È anche una buona idea guardare il codice sorgente della classe di preferenza (qui) per capire perché onSetInitialValue() deve essere implementato. In particolare, dai un'occhiata setDefaultValue(), e poi guarda dispatchSetInitialValue().

È possibile estendere le preferenze e impostare il valore predefinito durante la costruzione in questo modo:

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

Quindi puoi usarlo da XML in questo modo:

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

Penso che anche questo funzioni in qualsiasi momento.

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

Questo codice rileverà quando la finestra di dialogo sta per avviare e popolare la finestra di dialogo EDITText o elenco con il valore predefinito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top