【发布时间】:2016-01-19 21:02:23
【问题描述】:
我正在根据Google tutorial 实施首选项。但是我的事件侦听器没有收到更改。我意识到这是因为我在onResume 中注销了监听器,就像谷歌推荐的那样。我错过了什么还是谷歌的建议有误?
为了在活动中进行适当的生命周期管理,我们建议您 注册和注销您的 SharedPreferences.OnSharedPreferenceChangeListener 期间 onResume() 和 onPause() 分别回调:
public class MyActivity extends AppCompatActivity implements
NavigationView.OnNavigationItemSelectedListener,
SharedPreferences.OnSharedPreferenceChangeListener {
public boolean onOptionsItemSelected(MenuItem item) {
case R.id.action_level: {
Intent intent = new Intent();
intent.setClass(this, GamePreferenceActivity.class);
startActivity(intent);
return true;
...
protected void onPause() {
Log.d(logTag, "onPause()");
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
sharedPref.unregisterOnSharedPreferenceChangeListener(this);
super.onPause();
}
protected void onResume() {
Log.d(logTag, "onResume()");
super.onResume();
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
sharedPref.registerOnSharedPreferenceChangeListener(this);
}
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals(MyPreferenceActivity.KEY_COMPLEXITY)) {
String value = sharedPreferences.getString(key, "EASY");
logic.setLevel(Level.valueOf(value));
restartGame(null);
}
}
我的活动开始一个带有偏好活动的意图。
public class GamePreferenceActivity extends Activity {
public static final String KEY_COMPLEXITY = "prefGameComplexity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Display the fragment as the main content.
getFragmentManager().beginTransaction()
.replace(android.R.id.content, new GamePreferenceFragment())
.commit();
PreferenceManager.setDefaultValues(this, R.xml.game_prefs, false);
}
}
public class GamePreferenceFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.game_prefs);
}
}
【问题讨论】:
-
你能展示你的
onResume()实现吗?文档似乎是正确的。您在onResume()内注册并在onPause()内取消注册。 -
你的问题是什么?
-
看起来不错。你的监听器实现呢?
-
当您更改共享首选项时,最后是否调用了 commit()?
-
不,我没有。谷歌示例中没有这样的代码。感谢您指出这一点。
标签: android android-preferences