477 Stimmen

Wie kann ich den aktuellen Wert einer Android-Einstellung in der Einstellungsübersicht anzeigen?

Das muss sehr oft vorkommen.

Wenn der Benutzer die Einstellungen in einer Android-App bearbeitet, möchte ich, dass er den aktuell eingestellten Wert der Einstellung im Feld Preference Zusammenfassung.

Beispiel: Ich habe eine Einstellung für "Alte Nachrichten verwerfen", die die Anzahl der Tage angibt, nach denen Nachrichten bereinigt werden müssen. In der PreferenceActivity Ich möchte, dass der Benutzer das sieht:

"Alte Nachrichten verwerfen" <- Titel

"Nachrichten bereinigen nach x Tage" <- Zusammenfassung wobei x ist der aktuelle Präferenzwert

Extra Kredit: machen Sie diese wiederverwendbar, so kann ich leicht gelten es für alle meine Präferenzen unabhängig von ihrem Typ (so dass es mit EditTextPreference, ListPreference etc. mit minimalen Betrag der Codierung arbeiten).

1voto

gxcare Punkte 513

Um die Zusammenfassung einer ListPreference auf den in einem Dialog ausgewählten Wert zu übertragen, können Sie diesen Code verwenden:

package yourpackage;

import android.content.Context;
import android.util.AttributeSet;

public class ListPreference extends android.preference.ListPreference {

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

    protected void onDialogClosed(boolean positiveResult) {
        super.onDialogClosed(positiveResult);
        if (positiveResult) setSummary(getEntry());
    }

    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
        super.onSetInitialValue(restoreValue, defaultValue);
        setSummary(getEntry());
    }
}

und verweisen auf die yourpackage.ListPreference Objekt in Ihrem preferences.xml und vergessen Sie nicht, dort Ihre android:defaultValue denn dies löst den Aufruf von onSetInitialValue() .

Wenn Sie möchten, können Sie den Text dann vor dem Aufruf von setSummary() auf die für Ihre Anwendung geeignete Weise.

0voto

kjdion84 Punkte 8289

Hier ist eine funktionierende Lösung für alle EditTextPreference s innerhalb eines PreferenceFragment basierend auf der Antwort von @tdeveaux:

public class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {
    private static final String TAG = "SettingsFragment";

    @Override
    public void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onResume () {
        super.onResume();

        for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); ++i) {
            Preference preference = getPreferenceScreen().getPreference(i);
            updatePreference(preference);
        }
    }

    @Override
    public void onSharedPreferenceChanged (SharedPreferences sharedPreferences, String key) {
        updatePreference(findPreference(key));
    }

    private void updatePreference (Preference preference) {
        if (preference instanceof EditTextPreference) {
            EditTextPreference editTextPreference = (EditTextPreference)preference;
            editTextPreference.setSummary(editTextPreference.getText());
        }
    }
}

0voto

Ich habe diesen Weg gefunden, um EditTextPreference von der Unterstützungsbibliothek handle "%s" in Kürze (als ListPreference bereits behandelt):

public class EditTextPreference extends android.support.v7.preference.EditTextPreference {
    public EditTextPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void setText(String text) {
        super.setText(text);
        notifyChanged();
    }

    @Override
    public CharSequence getSummary() {
        String text = super.getText();
        String summary = super.getSummary().toString();
        return String.format(summary, text == null ? "" : text);
    }
}

In xml sieht das dann so aus:

<com.example.yourapp.EditTextPreference
    android:defaultValue="1"
    android:key="cleanup_period"
    android:summary="Clean up messages after %s days"
    android:title="Clean up period" />

-1voto

Dmitry Punkte 13721

Die prägnante Lösung mit 1 Zeile Code:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preferences);

    bindPreferenceSummaryToValue(findPreference("mySetting"));

    // initialize summary
    sBindPreferenceSummaryToValueListener.onPreferenceChange(findPreference("mySetting"), 
        ((ListPreference) findPreference("mySetting")).getEntry());
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X