我正在开发一个大量使用片段的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);
我想要实现的是,当应用程序恢复时,它会直接转到先前加载的片段,保留整个“后退”历史记录。我怎么能这样做?
我不确定是否需要其他代码部分,但如果是,我会根据需要发布。
答案 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()方法,稍微清理了我的代码,现在一切正常。