在偏好更改时,我在更新SharedPreferences中的摘要行时遇到一些问题。我在onResume()中有一个注册的OnSharePreferenceChangeListener,在onPause()中有一个注册的OnSharePreferenceChangeListener。
监听器正在运行,我可以使用onSharedPreferenceChanges()方法。我遇到的问题是能够在那里检索首选项,以便我可以调用setSummary()。我在冰淇淋三明治中,似乎不推荐使用findPreference(key)方法。所以:
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
Preference pref = findPreference(key);}
无效,实际上为pref返回null。从我看到的例子中,你需要优先调用它上面的setSummary()和想法吗?
答案 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)
返回null
。 OnSharedPreferenceChangeListener
上使用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}}