我正在使用Android兼容性库来实现片段并扩展了布局示例,以便片段包含一个触发另一个片段的按钮.
在左侧的选择窗格中,我有5个可选项 - A B C D E.
每个都FragmentTransaction:replace在详细信息窗格中加载一个片段(via ) -a b c d e
现在我扩展了片段e以包含一个按钮,该按钮e1还会在详细信息窗格中加载另一个片段.我在片段e的onClick方法上做了这个,如下所示:
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.replace(R.id.details_frag, newFrag);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();
Run Code Online (Sandbox Code Playgroud)
如果我做出以下选择:
E - e - e1 - D - E
Run Code Online (Sandbox Code Playgroud)
然后片段e在详细信息窗格中.这很好,我想要的.但是,如果我back在此时按下按钮它什么都不做.我必须点击两次,因为e1它仍然在堆栈上.点击后我在onCreateView中得到一个空指针异常:
为了"解决"这个问题,无论何时A B C D E选择,我都添加了以下内容:
FragmentManager fm = getActivity().getSupportFragmentManager();
for(int i = 0; i < fm.getBackStackEntryCount(); ++i) {
fm.popBackStack();
}
Run Code Online (Sandbox Code Playgroud)
只是想知道这是否是正确的解决方案或我是否应该做一些不同的事情?
我正在处理片段事务,而backstack是这样的:
fragA => fragB => fragC => fragD
Run Code Online (Sandbox Code Playgroud)
我想从碎片回来之后回到fragA
fragD => onBackPress => fragA
Run Code Online (Sandbox Code Playgroud)
所以,我试过像:
getChildFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
Run Code Online (Sandbox Code Playgroud)
但它清除了所有的后台堆叠,如何将第一个碎片保留在后台堆叠中?非常感谢
android android-fragments back-stack android-fragmentactivity fragment-backstack
我正在开发一款需要导航抽屉的应用.这个应用程序有1个MainActivity和大约10个片段.当我单击MainActivity中的导航抽屉图标时,它将显示10个片段,以便我可以选择每个片段.
我选择片段A,然后选择B,然后选择C ...到F.当我在片段F并按下后退按钮时,它会将我带回片段E,然后再返回它将带我去片段D ...
我的问题是,当我回到片段A(当然是从片段B)并再次按下"返回"按钮时,它会将我带到一个空白的白色屏幕(我认为这是主要的活动布局).然后再按回来,应用程序将退出.
我想要的是当我回到片段A(最后一个片段)并点击返回时,应用程序将立即退出,而不是空白的白色屏幕
我搜索了SO并发现了一个类似的问题,但还没有答案,所以我不得不提出另一个问题
我怎样才能做到这一点?非常感谢你
简单的问题,但似乎无法回答...如何清除fragmentManager后栈而不弹出片段?
我这样理解:
后栈条目=使用addToBackStack命令预先保存的事务列表.例如:"将片段1替换为片段2".
popBackStack =最后保存的transatcion反向.例如:"将片段2替换为片段1".
假设我做了第一笔交易:F1-> F2并将此交易添加到后台.当我按下后退按钮时,F2-> F1将会发生.
好的但是..
我改变了主意,想要清理后面的堆栈.我希望用户使用F2片段但是当他/她按下后退按钮时,Activity应该关闭,就像后面的堆栈是空的一样.
我需要这样的东西:
for(int i=0;i<getFragmentManager().getBackStackEntryCount();i++){
getFragmentManager().getBackStackEntryAt(i).remove();
}
Run Code Online (Sandbox Code Playgroud)
编辑 我试图向复杂的情况提出简单的问题,我得到简单的答案;)Abhishek Patel的答案非常好,但它不是我想要的.仍然是一个很好的答案.
只是为了澄清: android中的后台堆栈不是完全可编辑的列表,如:
我们不能做"删除交易3"来做:
我们无法清除所有后端堆栈并保持最后一个可见的碎片活着.
我们可以将backstacks记录删除到某个位置,例如:"删除所有事务到事务2"以获得:
在屏幕上,您将看到交易2的效果.
为什么我需要这个?
我认为我可以创建一个片段,它将是"主要片段".这个主要片段将使用一个接口来告诉它现在显示的任何活动,现在显示这个boss片段,以及之前发生的任何事情 - 不再重要了.
(F) - 片段,(A) - 活动
(F) - 嘿老兄.我是老板,我可见并且依附于你.请为我清理你的背包,但保留我的交易,这让我来到这里.
(A) - 对不起男人......你应该在交易前告诉我清理我的背包,这样我就可以在新的背包上添加你的交易了.
在我的开源Android应用程序中,发现了一个问题,即特定片段会出现在另一个片段之上,或者在特定情况下会使应用程序崩溃。
如果您想查看更多信息和示例屏幕截图,请查看GitHub上的问题:https : //github.com/rpi-mobile/RPIMobile-Android/issues/31
我已查明原因,但想知道使用android.support.v4.app包中的哪些方法来解决问题。
在中MainActivity.java,是用于FragmentTransaction.replace()切换片段的导航抽屉的代码。
之所以出现此问题,是因为在中MapFragment,我使用了:
ViewMapFragment vmf = new ViewMapFragment();
FragmentTransaction ft = getSherlockActivity().getSupportFragmentManager().beginTransaction();
ft.addToBackStack(null);
ft.replace(R.id.content_frame, vmf);
ft.commit();
Run Code Online (Sandbox Code Playgroud)
而在ViewMapFragment的onDestroyView():
FragmentManager fm = getSherlockActivity().getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.remove(fm.findFragmentById(R.id.mapview));
ft.commit();
Run Code Online (Sandbox Code Playgroud)
在onDestroyView()正确删除ViewMapFragment从视图,但如果你有它的视图,并使用导航抽屉变化到不同的片段,MapFragment还是回堆栈。
因此,对于我的问题:
1)在尝试删除/替换碎片之前,如何检查特定碎片是否在后堆栈上;如果您什么都不做,则应用程序不会崩溃(即不检查)吗?例如popBackStack(),在后栈上没有任何东西时调用。
2)应该使用FragmentManager类方法尝试MapFragment从后堆栈中删除还是应该使用FragmentTransaction方法?优点与缺点?
3)popBackStack()和之间的UI有什么区别popBackStackImmediate()?用户是否看到一些故障过渡?
清除片段后栈编程的最佳方法是什么?
我只使用一个活动和一组片段实现了屏幕导航.我想有一个方法将用户带到登录屏幕(当注销超时到期时)并清除所有片段历史记录,最好的方法是什么?我在这里找到的答案很少但我不知道哪个是最好的...提前谢谢!
目前我正在使用这个
public void clearBackStack() {
FragmentManager fragmentManager = holder.getSupportFragmentManager();
while (fragmentManager.getBackStackEntryCount() != 0) {
fragmentManager.popBackStack(null, 0);
}
}
Run Code Online (Sandbox Code Playgroud)
然而,有时我会出现OutOfMemoryException