java - fragment 回栈

标签 java android android-fragments

您好,我有一个 Activity 和三个 fragment 。当我替换我的第一个 fragment 时,我将它添加到 backstack。

FragmentTransaction fragmentTransaction = getFragmentManager()
            .beginTransaction();
fragmentTransaction.replace(R.id.authentication_parent0_linear,
                new LoginFragment(), LOGINTAG);
fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();

但是当我在其他两个 fragment 之间移动时,我没有将它们添加到后台堆栈。因此,每当我从其他两个 fragment 返回时,我需要返回到第一个 fragment 。当我删除第一个 fragment 并添加第二个 fragment 时,它工作正常 fragment 或首先删除并添加第三个,即当我按回时我回到第一个 fragment 。但是,当我在删除第二个 fragment 并添加第三个 fragment 或删除第三个 fragment 并添加第二个 fragment 等之间导航时。在那个实例中,当我按下后退键时,我退出了应用程序,backstackcount 显示为零,但是当我第一次删除第一个 fragment 时,我将它存储在了 backstack 中。

getFragmentManager()
            .beginTransaction()
            .replace(R.id.authentication_parent0_linear,
                    new SignupFragment(), SIGNUPTAG).commit();

所以我的问题是 fragment 后台堆栈是否会在提交之间重置。如果是这样我如何才能第一次在后台获取存储的 fragment

最佳答案

实现你想要的最好方法是不使用 fragment 的后台堆栈。

  1. 不要在任何地方使用addToBackStack()
  2. 在实例字段 mLoginFragment 中保留您的第一个 fragment LoginFragment 引用。添加您的第一个 fragment 将如下所示(可能在 Activity 的 onCreate() 中:

      FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
      mLoginFragment = new LoginFragment();
      fragmentTransaction.replace(R.id.authentication_parent0_linear, mLoginFragment, LOGINTAG);
      fragmentTransaction.commit();
    
  3. 在您的 Activity 中覆盖 onBackPressed() 方法如下:

    @Override
    public void onBackPressed() {
        Fragment fr = getFragmentManager().findFragmentById(R.id.authentication_parent0_linear);
    
        // chek that mLoginFragment!=null, basically this should never happen! 
    
        if (fr == mLoginFragment) {
            super.onBackPressed();
        } else {
            FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
          fragmentTransaction.replace(R.id.authentication_parent0_linear, mLoginFragment, LOGINTAG);
          fragmentTransaction.commit();
        }
    }
    

使用backstack 有一种繁琐的方法可以达到预期的效果。方法如下:

  1. 不要在创建 fragment A 时调用 addToBAckStack()
  2. 当从 fragment A 导航到 B 或 C,或导航到其他 fragment 时调用 addToBackStack()
  3. 当从 B 更深地导航到 C 等时,在事务之前调用 popBackStack()。可以在 SO 上找到它的解释。像这样:

    getFragmentManager().popBackStack();
    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
      fragmentTransaction.replace(R.id.authentication_parent0_linear, new FragmentC(), "whatever");
      fragmentTransaction.addToBackStack(null);
      fragmentTransaction.commit();
    

关于java - fragment 回栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28974703/

相关文章:

javafx tableview仅在排序后更新数据

java - Socket.getRemoteSocketAddress() 不返回客户端的私有(private) IP 地址

java - 如何为不同的 SDK 目标管理同一个类文件的多个版本?

android - tabMode ="scrollable"不工作

java.lang.NullPointerException 错误请

java - Spring 启动日志记录

java - 抽屉导航未加载新布局的 .java

java - 无法获取 Facebook ID 和电子邮件

android - 双工具栏显示在 fragment 上

java - 将数据从 RecyclerView 发送到 Fragment