Android:通过侦听器更新sharedPreferences摘要

时间:2012-07-24 21:18:53

标签: android sharedpreferences summary

在偏好更改时,我在更新SharedPreferences中的摘要行时遇到一些问题。我在onResume()中有一个注册的OnSharePreferenceChangeListener,在onPause()中有一个注册的OnSharePreferenceChangeListener。

监听器正在运行,我可以使用onSharedPreferenceChanges()方法。我遇到的问题是能够在那里检索首选项,以便我可以调用setSummary()。我在冰淇淋三明治中,似乎不推荐使用findPreference(key)方法。所以:

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
Preference pref = findPreference(key);}

无效,实际上为pref返回null。从我看到的例子中,你需要优先调用它上面的setSummary()和想法吗?

2 个答案:

答案 0 :(得分:5)

您不应该使用onSharedPreferenceChangedListener

相反,请使用类似的东西。

ListPreference myPreference = (ListPreference) findPreference("preference_key");
myPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        if (((String)newValue).equals("some_value")) {
            preference.setSummary("my summary");
        }
    }
});
不推荐使用

findPreference,而是不应该使用PreferenceActivity(已弃用)。如果您只需要支持Android 3.0+,那么您应该切换到新方法PreferenceFragment。如果您需要支持Android 2.1+,那么它很好,您可以忽略警告。

答案 1 :(得分:3)

我一直在尝试在代码中使用PreferenceFragment,我也看到findPreference(key)返回nullOnSharedPreferenceChangeListener上使用PreferenceFragment的{​​{3}}上的示例代码尚未针对NullPointerException进行全面更新,如果您逐字使用,则会Preference崩溃。

我终于明白了:你必须通过PreferenceFragment找到public class SettingsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener { protected SettingsFragment settingsFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); settingsFragment = new SettingsFragment(); getFragmentManager().beginTransaction().replace(android.R.id.content, settingsFragment).commit(); } // ... public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { if (key.equals("your_key")) { String newValue = sharedPreferences.getString(key, ""); settingsFragment.findPreference(key).setSummary(newValue); } } } ,因为当然这是首选项所在的位置。后见之明显而易见。像这样:

{{1}}