Seb*_*eit 12 android android-fragments
所以,有一些类似的问题,但我没有找到解决这个问题的单一问题.在官方Android文档似乎直观,但是当我实现与更复杂的工作流应用程序,碎片堆栈中变得混乱和怪异的东西开始发生.我为简单的应用程序开发了一个框架,其中包含单个活动的概念,可以通过其片段访问它以启动其他片段.我就这样做了:
1-让我的主要活动实现一个名为"FragmentDelegate"的界面
public interface FragmentDelegate {
public void startFragment(CCFragment fragment, boolean addToBackStack);
}
Run Code Online (Sandbox Code Playgroud)
2- startFrargment方法的实现:
@Override
public void startFragment(CCFragment fragment, boolean addToBackStack) {
FragmentManager fragmentManager = getSupportFragmentManager();
fragment.setFragmentDelegate(this);
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
fragmentTransaction.setCustomAnimations(R.anim.slide_in_right,
R.anim.slide_out_left, R.anim.slide_in_left,
R.anim.slide_out_right);
fragmentTransaction.replace(CONTENT_VIEW_ID, fragment,
"callerFragmentClassName");
if (addToBackStack)
fragmentTransaction.addToBackStack("callerFragmentClassName");
fragmentTransaction.commitAllowingStateLoss();
}
Run Code Online (Sandbox Code Playgroud)
关于这个很酷的是,我可以从任何片段调用:
mFragmentDelegate.startFragment(aNewFragment, addToBackStack);
Run Code Online (Sandbox Code Playgroud)
好了,现在想想以下案例场景:
我用一个初始片段开始我的活动,让我们说片段A.从片段A,我调用Camera Activity获得结果.当结果到来时,我启动片段B(将A添加到backstack).从BI开始片段C 而不向后台堆叠添加B. 所以我们在backstack中有这个:
[A] [C]
如果我按下后退按钮,我会回到A.如果我重复这个过程,背板会搞砸,当我按下时,它会一次又一次地把我带到C片段......
我知道这很难理解(我更难解释,因为英语不是我的母语)但是如果有人可以向我解释一下android片段背板是如何工作的,或者为应用程序提供某种骨架,会很好.
Zso*_*agy 18
说明:
当FragmentManager恢复保存的FragmentTransactions(例如,用户单击Back按钮或者您在其上调用了一些pop方法)时,它将执行与保存的FragmentTransaction中存储的操作相反的操作.你可以在这里看到确切的代码,它非常简单.
在您的情况下,保存的操作类型为"replace",因此还原意味着删除所有添加的Fragment实例并重新添加删除的实例.所以当你有一个像这样的片段堆栈时:
[A] [B]
FragmentManager知道,必须删除[B] Fragment实例并在弹出操作时添加[A].问题是,您用[C]替换了[B]:
[A] [C]
不幸的是,保存的Fragment BackStack条目不知道[C].因此在弹出操作期间,FragmentManager将重新添加[A],找不到[B],因此它不会对此做任何事情,并将[C]保留在原来的位置.
解
解决此问题的一种可能方法是使用子片段.片段-A是顶级片段,但片段-B和片段-C是WrapperFragment的子片段.
基本上,当您导航到Fragment-B时,在已保存的事务中将Fragment-A替换为WrapperFragment:
[A] [[B]]
之后,当用户导航到Fragment-C时,只能用[C]替换WrapperFragment的[B]:
[A] [[C]]
当用户按下后退按钮时,我们将正确返回Fragment-A:
[一个]
演示
我已经组建了一个GitHub项目来演示这种技术.