我有一个PreferenceActivity用于更改用户的首选项。我还定义了一些首选项,以保留一些不会在界面上显示的数据,我想以编程方式更改数据。
这是PreferenceActivity:
public class SettingsActivity extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getFragmentManager().beginTransaction()
.replace(android.R.id.content, new SettingsFragment()).commit();
}
public static class SettingsFragment extends PreferenceFragment implements
OnSharedPreferenceChangeListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences_settings);
getActivity().setTitle(R.string.title_settings);
getPreferenceScreen().getSharedPreferences()
.registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onSharedPreferenceChanged(
SharedPreferences sharedPreferences, String key) {
...
}
}
这是MainActivity:
public class MainActivity extends Activity {
...
public void onDestroy() {
SharedPreferences preferences = PreferenceManager
.getDefaultSharedPreferences(this);
//throws NullPointerException if SettingsActivity was created
preferences.edit().putInt("Number", 0).commit();
super.onDestroy();
}
}
奇怪的是,如果我打开SettingsActivity,当MainActivity为onDestroy()时,preferences.edit()会引发NullPointerException。如果从未创建SettingsActivity,则preferences.edit()可以正常工作。
看起来SettingsActivity阻止其他活动访问SharedPreference.Editor。有人可以帮我解决这个问题吗?
最佳答案
我怀疑当SettingsFragment和SettingsActivity被销毁时,您忘记了呼叫unregisterOnSharedPreferenceChangeListener
。因此,在应用程序关闭时尝试编辑首选项会触发对活动\片段的回调。
这只是一个猜测,因为您的回调用于SharedPreferences,而onDestroy代码用于DefaultSharedPreferences。