在主要活动ActivityA
中,我将FragmentA
替换为片段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] 看起来问题在于导航和导航的不同行为。如果我向后导航,则活动将显示在其上一个状态,同时向上导航会强制重新创建活动。
答案 0 :(得分:3)
“up”的行为有时会产生误导。当我遇到类似的问题时,我宁愿节省时间而不是处理保存状态。
您可以通过在Activity
:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
onBackPressed();
}
return true;
}
答案 1 :(得分:3)
让我们试试这个:
在parentActivity的意图中(如果您可以在创建parentActivity之前设置它最好,否则您可能必须使用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-someAct1-someAct2-B,并且你的启动意图解析为A,它也会被带到前面"杀死一些行为。
P.S。我没有做任何空检查,并没有记住确切的方法名称,只是给你一个方法。
答案 2 :(得分:2)
这种情况正在发生,因为当您转移到ActivityB
活动时,A将分别进行puse和destroy状态,因此当您返回活动ActivityA
时,ActivityA再次启动,因此您将获得fragmentA作为视图。您需要使用sharedPfer保存状态。使用一些标志来保存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();