Android活动导航保存状态

时间:2014-01-31 11:14:04

标签: android android-fragments navigation state

在主要活动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] 看起来问题在于导航和导航的不同行为。如果我向后导航,则活动将显示在其上一个状态,同时向上导航会强制重新创建活动。

3 个答案:

答案 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();