在主活动 ActivityA
中i替换 FragmentA
firef fragment FragmentB
。从FragmentB
用户可以启动新的活动ActivityB
。通过按ActivityB
中的后退按钮,显示了ActivityA
显示FragmentA
。我期望看到FragmentB
的最后状态。我是否必须分别保存以前的活动的状态才能提供此行为?
ActivityA(FragmentA) -> ActivityA(FragmentB) -> ActivityB
BACK
ActivityA(FragmentB)
在主要活动中,我使用以下方式设置了当前片段
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.a_main_frame_content, new FragmentB())
.addToBackStack(null)
.commit();
从片段我开始使用:
开始新的活动Intent intent = new Intent(getActivity(), ActivityB.class);
getActivity().startActivity(intent);
ActivityA
设置为ActivityB
的父活动以提供正确的导航。
[UPDTATE] 看来问题在于不同的行为,即导航和导航。如果我浏览,则该活动以其最后一个状态显示,同时导航迫使活动重新创建活动。
让我们尝试一下:
在父级的意图中(如果您可以在创建PartenActivity最好之前设置它,否则您可能必须使用setIntent):
currentActivityIntent.putExtra("random-unique-key-for-each-activity",
random-unique-key-for-each-activity);
,在创建儿童活动之前,您会在地图上进行关注:
myKeyIntentMap.put(random-unique-key-for-each-activity, currentActivityIntent);
在" UP"事件上触发的方法中:
{
String parentKey = currentActivity.parentActivity.getIntent.getStringExtra("random-unique-key-for-each-activity");
Intent intentToLaunch = (Intent)myKeyIntentMap.get(parentKey);
intentToLaunch.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP );
startActivity(intentToLaunch);
}
这样,即使您的历史堆栈是a-someactc1-someactc2-b,也要使用意图,并且u启动意图解决了A,它将"将"杀死"杀死。
。P.S。我还没有进行任何无效检查,并且还没有牢记确切的方法名称,只是给了您一种方法。
" up"的行为有时确实是误导的。当我面临类似的问题时,我宁愿节省时间,而不是处理保存状态。您可以通过在Activity
中捕获导航"向上"事件来快速解决它:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
onBackPressed();
}
return true;
}
这正在发生,因为当您移动到ActivityB
Activitya时,将分别掩盖和破坏状态,因此,当您返回活动时,ActivityA
Activitya正在再次开始,因此您将获得Fragmenta作为视图。您需要使用共享Pfer保存状态。使用一些标志将状态保存在您的onCreateView()
中,检查状态并为视图设置正确的片段。希望你明白了。
public static final String PREFS_NAME = "mypref";
boolean isVisited;
//check sharedpref
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
isVisited= settings.getBoolean("isVisited", false);
if(!isVisited){
// set fragmentA
}else{
// set fragmentB
}
// inside fragment transaction block
Editor edit = settings.editor();
isVisited.setBoolean(true);
edit.commit();