在单个片段事务中添加多个返回堆栈条目
Posted
技术标签:
【中文标题】在单个片段事务中添加多个返回堆栈条目【英文标题】:Add several back stack entries within single fragment transaction 【发布时间】:2016-07-07 16:53:04 【问题描述】:在将Fragment
添加到后台堆栈之前,我需要显示带有 2 个片段的 Fragment
。但是addToBackStack
方法属于FragmentTransaction
,所以我不能在单个FragmentTransaction
中添加所有三个,因为单击后退按钮将删除所有三个。但是如果我使用三个不同的FragmentTransation
s,那么直到第三个片段变得可见之前,用户也可以看到前两个片段。
有没有一种方法可以将三个Fragment
s 添加到后台堆栈中,而不会使前两个在事务期间可见?
【问题讨论】:
【参考方案1】:我不确定您是否可以使用本机 API 做到这一点。尽管如此,您可以使用Queue Interface
实现自己的堆栈【讨论】:
是的,但不幸的是我需要使用本机 API,因为我需要我的代码与旧版本兼容。 使用队列接口(Java 上下文)和旧的 android 版本(Android 上下文)之间没有联系。我的意思不是因为你实现了自己的堆栈(使用队列接口),你的代码将与最旧的 android 版本不兼容 我的代码是一个Android库。如果我切换到自定义队列,它将与我的一些图书馆用户的集成不兼容。【参考方案2】:在 fragmentmanager 添加一个 OnBackStackChangedListener ,然后当最后一个 backstack 条目是片段 2 时 popBackStack 两次这样:
0 FragmentHome ( back_stack_name : "fragment_home" )
1 Fragment1( back_stack_name : "fragment_1" )
2 Fragment2 ( back_stack_name : "fragment_2" )
3 Fragment3 ( back_stack_name : "fragment_3" )
代码:
请注意,您应该在 fragment3 中添加 OnBackStackChangedListener,然后在弹出 backstack 后将其从 fragmentmanager 中删除
// add in fragment3
final FragmentManager fragment_manager = getActivity().getSupportFragmentManager();
fragment_manager
.addOnBackStackChangedListener(new OnBackStackChangedListener()
@Override
public void onBackStackChanged()
if (fragment_manager.getBackStackEntryCount() > 0)
String last_fragment_name = getLastBackStackFragmentName(fragment_manager);
if (last_fragment_name.equals("fragment_2"))
fragment_manager.removeOnBackStackChangedListener(this);
fragment_manager.popBackStack();
fragment_manager.popBackStack();
);
private String getLastBackStackFragmentName(FragmentManager fragment_manager )
int back_stack_count =fragment_manager.getBackStackEntryCount();
String last_fragment_name = "";
if (back_stack_count>0)
last_fragment_name = fragment_manager.getBackStackEntryAt(
back_stack_count).getName();
return last_fragment_name;
【讨论】:
如果我理解你的意思,那么在单击 Fragment3 上的返回按钮后,我将导航到 HomeFragment。我需要相反:单击 Fragment3 上的后退按钮后,我应该导航到 Fragment2,但是当我将 Fragment3 添加到片段管理器中时,我还应该添加 Fragment1 和 Fragment2,但用户无法注意到它。 @Lingviston 在将这两个片段添加到后台堆栈后隐藏它们,然后在显示片段 3 后显示它们***.com/questions/14347588/… 有趣的是,我已经这样做了:D 不过还是谢谢!以上是关于在单个片段事务中添加多个返回堆栈条目的主要内容,如果未能解决你的问题,请参考以下文章