我已关注Google开发人员文档,并提出以下共享偏好活动:
public class SettingsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener {
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Display the fragment as the main content.
getFragmentManager().beginTransaction()
.replace(android.R.id.content, new SettingsFragment())
.commit();
}
public static class SettingsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
}
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
// TODO Auto-generated method stub
Toast.makeText(this, "Pref changed", Toast.LENGTH_SHORT).show();
}
@Override
protected void onResume() {
super.onResume();
getApplicationContext().getSharedPreferences(this.getLocalClassName(), MODE_PRIVATE).registerOnSharedPreferenceChangeListener(this);
//Toast.makeText(this, "registered pref listener", Toast.LENGTH_SHORT).show();
}
@Override
protected void onPause() {
super.onPause();
getApplicationContext().getSharedPreferences(this.getLocalClassName(), MODE_PRIVATE).unregisterOnSharedPreferenceChangeListener(this);
}
}
正如您所看到的,我在onSharedPreferenceChanged方法中有一条简单的toast消息,因此我可以看到它正常工作,但它似乎无法正常工作。
与Google文档的唯一区别在于我在onResume()中使用getApplicationContext()而不是getPreferenceScreen(),因为getPreferenceScreen()显示为已弃用。
我只需要弄清楚为什么它没有收听 - 我的偏好屏幕上只有复选框,所以我想,当我点击其中任何一个时,会调用onSharedPreferenceChanged()方法,我会看到我的吐司。 / p>
这个简单的让我难过。
答案 0 :(得分:2)
您正在将您的听众注册为错误的偏好。
SettingsFragment中XML资源的加载首选项使用默认的共享首选项,因此您应该像这样注册侦听器:
@Override
public void onResume() {
super.onResume();
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
pref.registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onPause() {
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
pref.unregisterOnSharedPreferenceChangeListener(this);
super.onPause();
}