【问题标题】:Android fragment navigation via replacable fragment通过可替换片段进行 Android 片段导航
【发布时间】:2016-07-30 13:06:07
【问题描述】:

我对 Fragment 很陌生,我正在尝试在这里实现某种类型的目标。

考虑这种情况:我有三个片段 F1、F2 和 F3。现在,当我从 F1 移动到 F2 时,没有问题。现在的问题是,F2 中有一个按钮,单击该按钮时,会将 F2 替换为 F3。这意味着,F3 应该“取代”F2 而不会在后台创建新项目。这背后的目的是,当用户在 F2 或 F3 时按下后退按钮时,它应该重定向回 F1。

我想我可以做到,但是按下后退按钮时会出现各种混乱。再一次,我想要的是,当 F2 或 F3 中的任何一个处于活动状态时,后退按钮应将我带回 F1。

我用来从 F1 转到 F2 的代码是:

FragmentManager fm = getFragmentManager();
            Fragment fr = new FragmentTwo();
            FragmentTransaction fragmentTransaction = fm.beginTransaction();
            fragmentTransaction.add(R.id.fragment_container, fr);
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();

我用来将 F2 替换为 F3 的代码是:

FragmentManager fm = getFragmentManager();
            Fragment fr = new FragmentThree();
            FragmentTransaction fragmentTransaction = fm.beginTransaction();
            fragmentTransaction.replace(R.id.fragment_container, fr);
            fragmentTransaction.commit();

我用来将 F3 替换为 F2 的代码是:

FragmentManager fm = getFragmentManager();
            Fragment fr = new FragmentTwo();
            FragmentTransaction fragmentTransaction = fm.beginTransaction();
            fragmentTransaction.replace(R.id.fragment_container, fr);
            fragmentTransaction.commit();

任何建议和提示将不胜感激。

编辑: 我已经在这里上传了我的项目的源代码:

https://ufile.io/4e665

问候

【问题讨论】:

  • I think I can do that however all sort of mess arises when pressing the back button。什么乱七八糟的??
  • @VivekMishra :嗯,我可以毫无问题地从 F1 到 F2 再回到 F1。但是当我从 F1 转到 F2 然后用 F3 切换 F2 并尝试返回按钮时,它不会恢复到 F1。相反,它停留在 F3。现在,如果我再次按下后退按钮,应用程序将关闭。所以基本上当我尝试从 F2 切换到 F3 时问题就开始了。不知何故,后台被搞砸了或其他什么..
  • 请查看原始帖子以获取指向我的项目的链接。时长
  • 使用 fragmentTransaction.addToBackStack(null);何时替换 F2 和 F3 之间的片段可能有用。
  • ^ 我试过了。没用。如果你从逻辑上思考,它不应该工作。假设我在 F2 和 F3 之间切换了十次。那么如果有addToBackStack的话,就会有十个在两个fragment之间切换的入口,按下后退按钮只会将这些入口一一回滚。换句话说,要进入 F1,我必须继续点击十次。

标签: android android-fragments navigation fragment


【解决方案1】:

好的,所以这可能不是最好的方法,但现在它解决了我的问题。我在从 F2 切换到 F3 并从 F3 切换回 F2 时尝试了这种方法,并且令人惊讶的是它起作用了(因为后退按钮正常运行):

FragmentManager fm = getFragmentManager();
            Fragment fr = new FragmentThree();
            FragmentTransaction fragmentTransaction = fm.beginTransaction();
            fragmentTransaction.add(R.id.fragment_container, fr);
            fragmentTransaction.addToBackStack(null);
            fm.popBackStackImmediate();
            fragmentTransaction.commit();

另外,请注意我的 onBackPressed 是这样实现的:

@Override
public void onBackPressed() {

        getFragmentManager().executePendingTransactions();
        int count = getFragmentManager().getBackStackEntryCount();

        System.out.println("getBackStackEntryCount() VALUE : " + count);

        if (count == 0) {

            System.out.println("onBackPressed() CALLED");
            super.onBackPressed();
            //additional code
        } else {

            System.out.println("popBackStack() CALLED");
            getFragmentManager().popBackStack();
        }


    }

【讨论】:

    【解决方案2】:
    @Override
    public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() > 1)
            getFragmentManager().popBackStackImmediate();
        else super.onBackPressed();
    }
    

    从活动到 F1

    FragmentManager fm = getFragmentManager();
    Fragment fr = new FragmentOne();
    FragmentTransaction fragmentTransaction = fm.beginTransaction();
    fragmentTransaction.add(R.id.fragment_container, fr);
    fragmentTransaction.commit();
    

    从 F1 到 F2

    FragmentManager fm = getFragmentManager();
    Fragment fr = new FragmentTwo();
    FragmentTransaction fragmentTransaction = fm.beginTransaction();
    fragmentTransaction.replace(R.id.fragment_container, fr);
    fragmentTransaction.commit();
    

    其他片段之间

    FragmentManager fm = getFragmentManager();
    Fragment fr = new FragmentThree();
    FragmentTransaction fragmentTransaction = fm.beginTransaction();
    fragmentTransaction.replace(R.id.fragment_container, fr);
    fragmentTransaction.commit();
    
    FragmentManager fm = getFragmentManager();
    Fragment fr = new FragmentTwo();
    FragmentTransaction fragmentTransaction = fm.beginTransaction();
    fragmentTransaction.replace(R.id.fragment_container, fr);
    fragmentTransaction.commit();
    

    【讨论】:

    • 您确定上述方法吗?我试过了,但它不起作用,这是理所当然的,它不应该起作用,因为在上面的任何一个块中,您都没有使用 addToBackStack。那么应用程序将如何反转到之前的片段呢?我试过你的代码,就像你在上面详述的那样,但是正如我解释的那样,在任何屏幕上,当按下后退按钮时,整个应用程序都会关闭,因为没有单一的交易记录(没有使用单一的 addToBackStack)......
    • 对不起,我忘记了这行'fragmentTransaction.addToBackStack("任何片段1的标签");'。替换前从 f1 到 f2 块中的这一行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    相关资源
    最近更新 更多