我在MainActivity的OnCreate()方法中获得了以下OnSharedPreferenceChangeListener:
SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener(){
@Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key){
if (key.equals("session_open")) {
signedIn = prefs.getBoolean("session_open", false);
if (signedIn) {
SlidingTabFragment fragment = new SlidingTabFragment();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.spotview_content_fragment, fragment)
.commit();
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
drawerLearned = prefs.getBoolean("drawer_learned", false);
if (!drawerLearned) {
mDrawerLayout.openDrawer(mDrawerList);
}
} else {
MainFragment mainFragment = new MainFragment();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.spotview_content_fragment, mainFragment)
.commit();
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
}
}
}
};
prefs.registerOnSharedPreferenceChangeListener(listener);
prefs变量初始化为prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
我还在片段中有一个facebook登录按钮,其中包含以下OnSessionChanged方法:
private void onSessionStateChange(Session session, SessionState state, Exception exception) {
if (state.isOpened()) {
editor.putBoolean("session_open", true);
} else if (state.isClosed()) {
editor.putBoolean("session_open", false);
}
editor.commit();
}
与
prefs = PreferenceManager.getDefaultSharedPreferences(this.getActivity().getApplicationContext());
editor = prefs.edit();
这个想法是,每当用户使用fb按钮登录或注销时,SharedPreferences都会更新,并且侦听器会对此进行选择并相应地更改布局。但是,这似乎总是起作用。大部分时间它确实有效,但有时它突然停止工作,我必须关闭应用程序并重新启动它以使其再次工作。然后,SharedPreferences已经更改,因为它以正确的布局打开(还检查OnCreate方法中的SharedPreferences,确保它在启动时加载正确的布局)。听众只是没有接受它。有人可以向我解释这里出了什么问题以及如何解决这个问题?如果您需要查看更多我的代码,请询问,我会发布您需要的内容。提前谢谢!
答案 0 :(得分:1)
我通过更改
修复了它SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener(){
@Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key){
到
listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
并将侦听器更改为私有变量。我还添加了以下@Override
函数:
@Override
public void onDestroy(){
super.onDestroy();
prefs.unregisterOnSharedPreferenceChangeListener(listener);
}
@Override
public void onPause(){
super.onPause();
prefs.unregisterOnSharedPreferenceChangeListener(listener);
}
@Override
public void onResume(){
super.onResume();
prefs.registerOnSharedPreferenceChangeListener(listener);
}
现在它每次都有效。