【问题标题】:Fragments navigation片段导航
【发布时间】:2016-12-08 08:43:19
【问题描述】:

我需要像在 Gmail 应用中一样创建片段导航。就像:我们有一个主片段A,我们可以从导航抽屉中打开另一个片段(B,C,D ...),当我们打开新片段时,它会在主片段顶部打开,当按下返回时按钮,在所有情况下,我们都会回到主片段 A,不要依赖于计算新打开的片段。看来,第一个主要片段 A 我们使用 add 方法(int FragmentTransaction)而不添加到片段 backStack。然后,下一个片段 B 我们也使用方法 add,添加到后堆栈。当我需要打开另一个(片段C)时,我需要替换第二个片段B。但是,当我使用方法replace()时,替换了所有容器,并且当从片段C或B按下后退按钮时主片段A没有显示和应用程序关闭。那么问题来了:如何只替换片段 B 或 C,而不丢失片段 A?

【问题讨论】:

    标签: android android-fragments fragmenttransaction fragment-backstack


    【解决方案1】:

    一个有效的解决方案是在您的活动中使用两个容器框架布局。第一个(位于另一个下方)包含您的片段 A。您打开的所有内容都将添加/替换到第二个容器中。

    另一种解决方案是在布局中静态包含片段 A,并在其顶部添加容器框架布局,然后在其中添加片段 B、C、D 等。

    【讨论】:

    • 我尝试做第二个解决方案。我静态添加了片段 A 并在顶部 FrameLayout 上为另一个片段创建。当我打开新的 Fragment 时,我使用了 replace(),但遇到了问题:如果我将新的 Fragment 添加到 back stack,onBack 已按下我已经打开了之前的 Fragment,如果我不添加到 back stack,onBackpressed 应用程序关闭。
    • 我想,我只需要将另一个片段的第一个片段添加到后端堆栈(例如:B、C、D 等)
    • 是添加到后端堆栈仅用于第一个片段
    【解决方案2】:

    像这样打开片段

    HighlightFragment highlightFragment=new HighlightFragment(FirstReaderScreen.this); //Your fragment
        getSupportFragmentManager()
        .beginTransaction()
        .add(R.id.LL_Fragment, highlightFragment) // LL_fragment is container
        .addToBackStack(null)
        .commit();
    

    在 Activity OnBackPress 中

    @Override
    public void onBackPressed() {
        if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
            getSupportFragmentManager().popBackStack();
        } else {
            super.onBackPressed();
        } 
    }
    

    【讨论】:

    • 为什么,当我执行 addToBackStack(null) 时,我遇到了崩溃 NullPointerException?
    • 它对我来说很好用你能发布 Logcat 吗
    猜你喜欢
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多