我用导航抽屉和内容片段实现了一个活动。内容片段被多次替换。但是在某些时候,我必须提供一个跳转到具有特定状态的特定片段。我设法保存了所有必需的变量。它经常工作,但并不总是跳回。
如果特定片段调用他们的onPause()
方法,我会在操作栏中显示一个按钮。但是,由于片段的生命周期与活动相关联并且活动没有变化,因此有时按钮不会出现,因为onPause()
没有被调用。
所以:如果一个片段不再在前台,哪个方法总是被触发?我试过:onPause
,, onStop
....onHiddenChanged()
更新:
这是我保存游戏状态的代码,它放在片段中。直到现在它被放在onStop()
方法中。gamelogic 变量是一个具有许多值和集合的对象。我将其保存到共享首选项中。
@Override
public void onStop() {
super.onStop();
if(!isGameDone){
SharedPfref sharedPfref = new SharedPfref();
sharedPfref.saveGameLogicInSharedPref(this.gameLogic);
} else {
SharedPfref sharedPfref = new SharedPfref();
sharedPfref.deleteGameLogicFromSharedPref();
}
}
在我的主要活动中,我决定是否在操作栏上显示一个图标。通过按下此按钮,我使用已保存的游戏状态保持器重新启动片段。
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
SharedPfref sharedPfref = new SharedPfref();
if(sharedPfref.isGameLogicSavedInSharedPref()){
menu.findItem(R.id.action_resume_game).setVisible(true);
} else {
menu.findItem(R.id.action_resume_game).setVisible(false);
}
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
switch(item.getItemId()) {
case R.id.action_resume_game:
SharedPfref sharedPfref = new SharedPfref();
GameLogic gameLogic = sharedPfref.loadGameLogicFromSharedPref();
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.content_frame, GameFragment.newInstance(gameLogic))
.commit();
return true;
default:
return super.onOptionsItemSelected(item);
}
}