Android在恢复时重新加载片段堆栈

时间:2016-09-05 12:24:41

标签: android android-fragments

我正在开发一个大量使用片段的Android应用程序,我遇到了一个问题,到目前为止我一直无法找到解决方案。 流程是这样的:应用程序启动,MainActivity是第一个响应者,现在,根据用户交互,几个片段被加载并压入堆栈。 这是一个例子:

主要活动 - >片段A - >片段B - >片段C - >等。

后退历史记录的启用方式如下:

片段C - >片段B - >片段A - >等。

只要我的应用程序位于前台,但是当应用程序进入后台时,一切都会中断,一切都很好。

如果我在片段B上,例如我按下主页按钮,应用程序进入后台,当我恢复它时,它从MainActivity开始,带有片段A. 此外,工具栏显示片段B的标题,并且由于片段A包含recyclerview,我可以在项目行之间看到片段B的部分,如背景图像。

这是我加载片段的方式:

public void loadFragment(Fragment fragment, Boolean addToStack) {

    // Load fragment
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.frame_container, fragment);
    fragmentTransaction.addToBackStack(null);

    // show back button
    if (addToStack) {

        // Code to show the back button.
    }
    else if (fragmentManager.getBackStackEntryCount() > 0 && !addToStack) {

        hideBackButton();

        fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }

    fragmentTransaction.commitAllowingStateLoss();
}

我从MainActivity和片段中调用此函数:

MyFragment theFragment = new MyFragment();
MainActivity.instance.loadFragment(theFragment, true);

我想要实现的是,当应用程序恢复时,它会直接转到先前加载的片段,保留整个“后退”历史记录。我怎么能这样做?

我不确定是否需要其他代码部分,但如果是,我会根据需要发布。

2 个答案:

答案 0 :(得分:0)

调用onResume()函数:

public void onResume(){
    Fragment frg = null;
    frg = getSupportFragmentManager().findFragmentByTag("Your_Fragment_TAG");
    final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.detach(frg);
    ft.attach(frg);
    ft.commit();
}

答案 1 :(得分:0)

好的,经过大量的研究后我发现了这个问题......这个问题是我的错误。

我想在此处为可能遇到同样问题的每个人报告。

起初我试图在onResume()函数上强制替换片段,如下所示:

Fragment f = getSupportFragmentManager().findFragmentById(R.id.container);
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.frame_container, f);
fragmentTransaction.addToBackStack(null);

然而,android应该自动处理所有这些,至少在我的知识中,所以我试图进一步挖掘,最后我把它缩小到我的onStart()方法。 基本上我正在注册EventBus并进行函数调用

if (!EventBus.getDefault().isRegistered(this)) {

    EventBus.getDefault().register(this);

    UserNetworkManager userNetworkManager = new UserNetworkManager(MainActivity.mainActivity);
    userNetworkManager.fetchFeed();
}   

这段代码创建了这个问题,毕竟没有必要把它放在那里,所以我把它移到了onCreate()方法,稍微清理了我的代码,现在一切正常。