【问题标题】:DrawerLayout item click replace fragment from backstack is wrong positionDrawerLayout 项目单击从后台堆栈替换片段的位置错误
【发布时间】:2014-07-03 12:01:47
【问题描述】:

在我的应用中有 5 个片段(FragA、FragB、FragC、FragD、FragE)

步骤 1. 应用启动时 FragA 处于打开状态

第 2 步。我点击抽屉布局项目打开 FragB 然后 FragB 是打开的

第 3 步。我点击抽屉布局项打开 FragC,然后 FragC 就打开了

第 4 步。我点击抽屉布局项打开 FragB,然后 FragB 就打开了

第 5 步。我单击返回按钮,它从 FragB 返回到 FragA 而不是 FragC。为什么?

我认为在第 4 步将 FragB 放在前面并销毁 FragC(不是重新排序后堆的位置)

我想把选定的片段放在前面,然后对 backstack 的位置进行排序(而不是销毁)

1.before click drawerlayout item to open FragB again
FragA-->FragB-->FragC
2.after click drawerlayout item to open FragB
FragA-->FragC-->FragB

如何解决?

这是我用来替换片段的方法

public void replaceFragment (Fragment fragment){
    String backStateName =  fragment.getClass().getName();
    String fragmentTag = backStateName;

    FragmentManager manager = getFragmentManager();

    boolean fragmentPopped = manager.popBackStackImmediate(backStateName, 0);

    if (!fragmentPopped && manager.findFragmentByTag(fragmentTag) == null){ //fragment not in back stack, create it.
        FragmentTransaction ft = manager.beginTransaction();
        ft.replace(R.id.frame_container, fragment, fragmentTag);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        ft.addToBackStack(backStateName);
        ft.commit();
    }
}

【问题讨论】:

    标签: android android-fragments back-stack


    【解决方案1】:

    这可能是因为您的第一个 Fragment 包含在默认 Activity 中,但您可以尝试以下方法之一:

    public abstract boolean popBackStackImmediate (int id, int flags) or

    public abstract boolean popBackStackImmediate (String name, int flags) or

    public abstract void putFragment (Bundle bundle, String key, Fragment fragment)

    来源:片段管理器文档http://developer.android.com/reference/android/app/FragmentManager.html

    【讨论】:

    • 我不明白。我如何使用您的答案来解决可能的问题。在哪里?什么时候?。请一步步指导我
    • 这些方法可用于返回应用程序的前一个片段(前一个是指您触发的最后一个片段,而不是按基本顺序的前一个片段)。您可以在您的类中使用它们(例如公共抽象类),或者您需要在其中显示此行为的自定义接口(例如公共接口 PreviousFragment)。根据您使用的方法,您必须将每个所需的参数放在 () 中。
    • 非常感谢。问题是因为我不了解 backstack 中片段的生命周期。我只能通过 addToBackStack() 而不是 popBackStack() 来解决它。当我打开新片段时,它会添加到后台堆栈中,当我单击后退按钮时,它会返回到旧片段(不是从后台堆栈中弹出),这对我来说效果很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 2011-09-24
    相关资源
    最近更新 更多