在单个片段事务中添加多个返回堆栈条目

Posted

技术标签:

【中文标题】在单个片段事务中添加多个返回堆栈条目【英文标题】:Add several back stack entries within single fragment transaction 【发布时间】:2016-07-07 16:53:04 【问题描述】:

在将Fragment 添加到后台堆栈之前,我需要显示带有 2 个片段的 Fragment。但是addToBackStack 方法属于FragmentTransaction,所以我不能在单个FragmentTransaction 中添加所有三个,因为单击后退按钮将删除所有三个。但是如果我使用三个不同的FragmentTransations,那么直到第三个片段变得可见之前,用户也可以看到前两个片段。

有没有一种方法可以将三个Fragments 添加到后台堆栈中,而不会使前两个在事务期间可见?

【问题讨论】:

【参考方案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 不过还是谢谢!

以上是关于在单个片段事务中添加多个返回堆栈条目的主要内容,如果未能解决你的问题,请参考以下文章

如何在按下单个片段的手动后退按钮时返回上一个片段?

添加片段后,前一个片段仍然可见

Android从后台堆栈中删除事务

使用片段返回堆栈处理 ActionBar 标题?

添加到后台堆栈时如何保持片段状态?

添加到后台堆栈时如何维护片段状态?