Android:关闭PreferenceActivity后,在SharedPreference.Editor上获取NullPointerException

时间:2014-08-24 05:28:57

标签: android nullpointerexception editor sharedpreferences

我有一个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。有谁可以帮我解决这个问题?

1 个答案:

答案 0 :(得分:1)

我怀疑您在销毁SettingsFragment和SettingsActivity时忘记调用unregisterOnSharedPreferenceChangeListener。因此,在应用程序关闭时尝试编辑首选项会触发对activity \ fragment的回调。

这只是猜测,因为您的回调是针对SharedPreferences而onDestroy代码是针对DefaultSharedPreferences的。