在单个片段事务中添加几个后栈条目

时间:2016-03-21 09:01:07

标签: android android-fragments fragmentmanager

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

有没有办法可以在后台堆栈中添加三个Fragment,而不会在交易过程中将前两个run显示出来?

2 个答案:

答案 0 :(得分:0)

我不确定您是否可以使用本机API执行此操作。尽管如此,您可以使用Queue Interface

实现自己的堆栈

答案 1 :(得分:0)

将一个OnBackStackChangedListener添加到fragmentmanager,然后当最后一个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;
        }