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

3voto

caw Punkte 30071

Wenn Sie nur den reinen Textwert jedes Feldes als Zusammenfassung anzeigen möchten, sollte der folgende Code am einfachsten zu pflegen sein. Es sind nur zwei Änderungen erforderlich (Zeilen 13 und 21, gekennzeichnet mit "hier ändern"):

package com.my.package;

import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;

public class PreferencesActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener {

    private final String[] mAutoSummaryFields = { "pref_key1", "pref_key2", "pref_key3" }; // change here
    private final int mEntryCount = mAutoSummaryFields.length;
    private Preference[] mPreferenceEntries;

    @SuppressWarnings("deprecation")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences_file); // change here
        mPreferenceEntries = new Preference[mEntryCount];
        for (int i = 0; i < mEntryCount; i++) {
            mPreferenceEntries[i] = getPreferenceScreen().findPreference(mAutoSummaryFields[i]);
        }
    }

    @SuppressWarnings("deprecation")
    @Override
    protected void onResume() {
        super.onResume();
        for (int i = 0; i < mEntryCount; i++) {
            updateSummary(mAutoSummaryFields[i]); // initialization
        }
        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); // register change listener
    }

    @SuppressWarnings("deprecation")
    @Override
    protected void onPause() {
        super.onPause();
        getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); // unregister change listener
    }

    private void updateSummary(String key) {
        for (int i = 0; i < mEntryCount; i++) {
            if (key.equals(mAutoSummaryFields[i])) {
                if (mPreferenceEntries[i] instanceof EditTextPreference) {
                    final EditTextPreference currentPreference = (EditTextPreference) mPreferenceEntries[i];
                    mPreferenceEntries[i].setSummary(currentPreference.getText());
                }
                else if (mPreferenceEntries[i] instanceof ListPreference) {
                    final ListPreference currentPreference = (ListPreference) mPreferenceEntries[i];
                    mPreferenceEntries[i].setSummary(currentPreference.getEntry());
                }
                break;
            }
        }
    }

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        updateSummary(key);
    }

}

3voto

Oded Breiner Punkte 26754

Einfach:

listPreference.setSummary("%s");

3voto

DSlomer64 Punkte 4094

ZU IHRER INFORMATION:

findPreference(CharSequence key)
This method was deprecated in API level 11. This function is not relevant
for a modern fragment-based PreferenceActivity.

Umso mehr lohnt es sich, einen Blick auf die sehr schicke Answer von @ASD oben ( Quelle hier gefunden ), die besagt, dass man %s en android:summary für jedes Feld in preferences.xml . (Der aktuelle Wert der Präferenz wird ersetzt durch %s .)

enter image description here

<ListPreference
 ...        
 android:summary="Length of longest word to return as match is %s"
 ...
 />

3voto

Razeeman Punkte 91

Da in androidx die Klasse Preference die ZusammenfassungAnbieter Schnittstelle kann dies auch ohne OnSharedPreferenceChangeListener erfolgen. Einfache Implementierungen werden für EditTextPreference und ListPreference bereitgestellt. Aufbauend auf EddieB's Antwort kann es folgendermaßen aussehen. Getestet auf androidx.preference:preference:1.1.0-alpha03.

package com.example.util.timereminder.ui.prefs;

import android.os.Bundle;

import com.example.util.timereminder.R;

import androidx.preference.EditTextPreference;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceGroup;

/**
 * Displays different preferences.
 */
public class PrefsFragmentExample extends PreferenceFragmentCompat {

    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        addPreferencesFromResource(R.xml.preferences);

        initSummary(getPreferenceScreen());
    }

    /**
     * Walks through all preferences.
     *
     * @param p The starting preference to search from.
     */
    private void initSummary(Preference p) {
        if (p instanceof PreferenceGroup) {
            PreferenceGroup pGrp = (PreferenceGroup) p;
            for (int i = 0; i < pGrp.getPreferenceCount(); i++) {
                initSummary(pGrp.getPreference(i));
            }
        } else {
            setPreferenceSummary(p);
        }
    }

    /**
     * Sets up summary providers for the preferences.
     *
     * @param p The preference to set up summary provider.
     */
    private void setPreferenceSummary(Preference p) {
        // No need to set up preference summaries for checkbox preferences because
        // they can be set up in xml using summaryOff and summary On
        if (p instanceof ListPreference) {
            p.setSummaryProvider(ListPreference.SimpleSummaryProvider.getInstance());
        } else if (p instanceof EditTextPreference) {
            p.setSummaryProvider(EditTextPreference.SimpleSummaryProvider.getInstance());
        }
    }
}

2voto

Salman von Abbas Punkte 22782

Meine Lösung ist die Erstellung eines benutzerdefinierten EditTextPreference , die in XML wie folgt verwendet wird: <com.example.EditTextPreference android:title="Example Title" />

EditTextPreference.java :-

package com.example;

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

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

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

    public EditTextPreference(Context context)
    {
        super(context, null);
    }

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

        setSummary(getSummary());
    }

    @Override
    public CharSequence getSummary()
    {
        return getText();
    }
}

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