Как отобразить текущее значение предпочтения Android в сводке настроек? - PullRequest
442 голосов
/ 10 февраля 2009

Это должно появляться очень часто.

Когда пользователь редактирует настройки в приложении для Android, я бы хотел, чтобы они могли видеть текущее установленное значение предпочтения в сводке Preference.

Пример: если у меня есть параметр Предпочтения для «Отменить старые сообщения», который указывает количество дней, после которых сообщения должны быть очищены. В PreferenceActivity я бы хотел, чтобы пользователь увидел:

"Отменить старые сообщения" <- title </p>

«Очистить сообщения после x дней» <- <a href="http://code.google.com/android/reference/android/preference/Preference.html#setSummary(java.lang.CharSequence)" rel="noreferrer"> сводка , где x - текущее значение предпочтения

Дополнительный кредит: сделайте это повторно используемым, чтобы я мог легко применить его ко всем моим предпочтениям независимо от их типа (чтобы он работал с EditTextPreference, ListPreference и т. Д. С минимальным количеством кода).

Ответы [ 32 ]

0 голосов
/ 06 мая 2018

Я нашел этот способ сделать EditTextPreference из дескриптора библиотеки поддержки "%s" в итоге (как ListPreference уже обрабатывает):

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

В xml это будет выглядеть так:

<com.example.yourapp.EditTextPreference
    android:defaultValue="1"
    android:key="cleanup_period"
    android:summary="Clean up messages after %s days"
    android:title="Clean up period" />
0 голосов
/ 05 февраля 2017

Вот рабочее решение для всех EditTextPreference s внутри PreferenceFragment на основе ответа @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());
        }
    }
}
...