在摘要中显示EditTextPreference当前值

时间:2017-07-20 16:37:09

标签: android summary android-sharedpreferences edittextpreference

我希望能够在摘要字段中显示EditTextPreference的值。具体来说,我想在PreferenceFragmentCompat中执行此操作。

import android.support.v7.preference.PreferenceFragmentCompat;

public class SettingsFragment extends PreferenceFragmentCompat {

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

首选项文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <EditTextPreference
        android:defaultValue="DEVICE01"
        android:key="device_id"
        android:title="Device ID" />
</PreferenceScreen>

我见过其他解决方案,但其中没有一个包含如何在PreferenceFragmentCompat中执行此操作。

3 个答案:

答案 0 :(得分:1)

我认为,它与每个简单的PreferenceFragment中的方式相同: 在xml文件中:

android:summary="@string/your_string_resource"

在代码中:

    EditTextPreference editTextPreference = (EditTextPreference) findPreference(YOUR_PREFERENCE_KEY);
    editTextPreference.setSummary(sharedPreferences.getString(YOUR_PREFERENCE_KEY, defaultValue));
    editTextPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object o) {

            String yourString = o.toString();
            sharedPreferences.edit().putString(YOUR_PREFERENCE_KEY, yourString).apply();
            editTextPreference.setSummary(yourString);

            return true;
        }
    });

答案 1 :(得分:1)

@ grabarz121的回答让我朝着正确的方向前进。这是我添加到首选项中的内容:

android:summary="@string/pref_device_id_summary"

这是我修改/添加到SettingsFragment类的内容:

public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
    addPreferencesFromResource(R.xml.preferences);
    sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getContext());
    setDeviceIdSummary();
}

public void setDeviceIdSummary() {
    final String deviceIdKey = getString(R.string.pref_device_id_key);
    String deviceIdDefault = getString(R.string.pref_device_id_default);
    String deviceIdValue = sharedPreferences.getString(deviceIdKey, deviceIdDefault);

    final EditTextPreference editTextPreference = (EditTextPreference) findPreference(deviceIdKey);
    editTextPreference.setSummary(deviceIdValue);

    editTextPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object o) {

            String newValue = o.toString();
            sharedPreferences.edit().putString(deviceIdKey, newValue).apply();
            editTextPreference.setSummary(newValue);
            return true;
        }
    });
}

答案 2 :(得分:0)

这个问题仍然出现在Google上,现在有一种更直接的方法(使用androidx)来解决这个问题。

<PreferenceScreen 
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <EditTextPreference
        android:key="prefFoobar"
        android:title="@string/preference_foobar"
        android:persistent="true"
        app:useSimpleSummaryProvider="true" />
</PreferenceScreen>

“ app:useSimpleSummaryProvider”发挥了所有作用。