Android活动导航保存状态



在主活动 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();

相关内容

  • 没有找到相关文章

最新更新