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

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

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

【问题讨论】:

    标签: android android-fragments fragmentmanager


    【解决方案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 后显示它们stackoverflow.com/questions/14347588/…
    • 有趣的是,我已经这样做了:D 不过还是谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多