Android PreferenceFragment,持久性UI更新的最佳实践?

时间:2016-05-22 23:53:58

标签: android android-preferences android-sharedpreferences

我正在通过PreferenceFragment为我的Android应用实施设置。 我的android:summary用于不同的首选项应该始终显示当前值,因此我已阅读了多篇帖子和official documentation。 虽然我从技术上讲它的解决方案看起来很糟糕,但我现在正在寻找最佳实践,因为我没有找到关于它如何正确实现的良好来源。

例如,我实施onSharedPreferenceChanged来监听更改并更新用户界面,但每次重新启动PreferenceFragment后,系统会再次显示初始android:summary。为了解决这个问题,我将其添加到onCreate

// display current value in the UI 
EditTextPreference editText = (EditTextPreference) findPreference("serverAddress"); 
editText.setSummary(editText.getText());

这是应该如何完成的,还是我误解了什么?

完整代码:

public class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {

    public static final String KEY_PREF_SERVER_ADDRESS = "serverAddress";
    public static final String KEY_PREF_GENDER = "gender";

    public SettingsFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle saveInstanceState) {
        super.onCreate(saveInstanceState);
        //Load the preferences from the XML file
        addPreferencesFromResource(R.xml.preferences);

        // display current value in the UI
        EditTextPreference editText = (EditTextPreference) findPreference("serverAddress");
        editText.setSummary(editText.getText());

    }

    // Listen for settings changes and update the UI
    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        if (key.equals(KEY_PREF_SERVER_ADDRESS)) {
            Preference serverAddressPref = findPreference(key);
            //Set UI to display updated summary
            serverAddressPref.setSummary(sharedPreferences.getString(key, ""));
        }
        if (key.equals(KEY_PREF_GENDER)) {
            Preference serverAddressPref = findPreference(key);
            //Set UI to display updated summary
            serverAddressPref.setSummary(sharedPreferences.getString(key, ""));
        }

    }

    @Override
    public void onResume() {
        super.onResume();
        getPreferenceScreen().getSharedPreferences()
                .registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onPause() {
        super.onPause();
        getPreferenceScreen().getSharedPreferences()
                .unregisterOnSharedPreferenceChangeListener(this);
    }
}

0 个答案:

没有答案