我使用导航抽屉和内容片段实现了一项活动。内容片段被多次替换。但在某些时候,我必须提供一个具有特定状态的特定片段的跳回。我设法保存所有必需的变量。它经常运作,但并不总是跳回来。
如果特定片段调用其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);
}
}
答案 0 :(得分:2)
我将以下图像保存到计算机中,以便快速查看。我认为这是非常自我解释的。如果onDestroy
和onPause
没有删除它,我会尝试onStop
。