【问题标题】:how to go back to previous fragment on pressing manually back button of individual fragment?如何在按下单个片段的手动后退按钮时返回上一个片段?
【发布时间】:2012-12-25 21:15:06
【问题描述】:

我的应用程序中只有一个activity 和多个fragments

两个主要片段 A(左)和 B(右)。

Fragment A1 called from A

B1 called from B

B2 called from B1

所有fragments 都有单独的后退按钮。

所以当我按下fragment A1 的返回按钮时,它应该返回到A,类似地,当来自B2 的返回按钮是按下,B1出现,从B1B等等。

如何实现这类功能?

【问题讨论】:

  • All fragments have individual back buttons. 这对我来说完全没有意义。请您进一步解释一下吗?
  • 左片段A和右片段B,我在A中有3个按钮。当按下A的第一个按钮时,显示A1。我在 A1 中有列表视图。单击列表视图项目时,其详细信息显示在右侧片段 B1 上。 A的其他2个按钮也一样。

标签: android fragment back


【解决方案1】:
public void onBackPressed()
{
    FragmentManager fm = getActivity().getSupportFragmentManager();
    fm.popBackStack();
}

【讨论】:

  • 使用 import android.support.v4.app.FragmentManager 的最佳答案;
【解决方案2】:

我刚才已经实现了类似的场景。

Activity 'A' -> 调用片段'A1'并单击菜单项,它调用片段'A2',如果用户从'A2'按下返回按钮,则返回到'A1',如果之后用户从“A1”按回,它完成了活动“A”并返回。

查看以下代码:

Activity 'A' - OnCreate() 方法:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activityA);

    if (savedInstanceState == null) {
        Fragment fragInstance;

        //Calling the Fragment newInstance Static method
        fragInstance = FragmentA1.newInstance();

        getFragmentManager().beginTransaction()
                .add(R.id.container, fragInstance)
                .commit();
    }
}

片段:'A1'

当菜单项点击操作发生时,我正在用新的 Fragment 替换现有的 Fragment:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == R.id.action_edit_columns) {
        //Open the Fragment A2 and add this to backstack
        Fragment fragment = FragmentA2.newInstance();
        this.getFragmentManager().beginTransaction()
                .replace(R.id.container, fragment)
                .addToBackStack(null)
                .commit();

        return true;
    }
    return super.onOptionsItemSelected(item);
}

Activity 'A' - onBackPressed() 方法:

由于所有片段都有一个父 Activity(即“A”),因此 onBackPressed() 方法可让您弹出片段(如果有的话)或返回到前一个 Activity。

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

如果您正在寻找在 Fragments 中嵌入 Fragments,请参考链接:http://developer.android.com/about/versions/android-4.2.html#NestedFragments

【讨论】:

  • 我认为这是最好的答案,因为你真的不想忘记首先“addToBackStack”你的片段。否则,后面就没有什么可弹出的了!
  • 是的..没有人提到addToBackStack 方法。谢谢
  • 目前,我也在做类似的流程,这对我处理后按很有帮助。
【解决方案3】:

@trueblue 的回答让我解决了一个小而烦人的问题。当 backstack 上只有一个片段并且您按下后退按钮时,该帧将被删除,并且应用程序保持活动状态并显示空白屏幕。用户需要再按一次返回按钮才能退出应用程序。为了处理这种情况,我将原代码修改为如下

@Override
public void onBackPressed() {
    if(getFragmentManager().getBackStackEntryCount() == 0) {
        super.onBackPressed();
    }
    else if(getFragmentManager().getBackStackEntryCount() == 1) {
        moveTaskToBack(false);
    }
    else {
        getFragmentManager().popBackStack();
    }
}

当backstack中只有1个fragment时,我们基本上是在告诉android将整个应用程序移到后面。

更新(可能是更好的答案)

因此,在对此进行了更多阅读之后,我发现您可以 add fragment manager transactions to back stack 然后 android 会自动以所需的方式处理后按。下面的代码 sn-p 显示了如何做到这一点

Fragment fragment; //Create and instance of your fragment class here
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

fragmentTransaction.replace(R.id.fragment_container, fragment).addToBackStack(null);
fragmentTransaction.commit();
fragmentTransaction.addToBackStack(null);

最后一行显示了如何将事务添加到后台堆栈。这解决了大多数情况下片段的后压问题,除了一个。如果您继续按返回按钮,那么最终您将到达一个点,即返回堆栈中只有一个片段。此时,您将想做两件事之一

  1. 从正在运行活动的任务的后台堆栈中删除包含该片段的活动。这是因为您不想以空白活动结束
  2. 如果该活动是该任务的后台堆栈中的唯一活动,则将该任务推入后台。

在我的情况下,是后者,所以我修改了之前答案中覆盖的 onBackPressed 方法,如下所示

@Override
public void onBackPressed() {
    if(getFragmentManager().getBackStackEntryCount() == 1) {
        moveTaskToBack(false);
    }
    else {
        super.onBackPressed();
    }
}

此代码更简单,因为它的逻辑更少,并且它依赖于框架而不是我们的自定义代码。不幸的是,我没有设法为第一种情况实现代码,因为我不需要。

【讨论】:

  • 这需要更多的投票!对我很有用。谢谢!
  • 当我在 commit() 之后调用 addToBackStack(null) 时,我得到 java.lang.IllegalStateException: addToBackStack() 在 commit() 之后调用;在解决问题之前移动它
【解决方案4】:

您必须按照 here. 的说明实现自己的 backstack 实现

您可以在您单击片段中的后退按钮时调用popFragments(),并在您从一个片段导航到另一个片段时调用pushFragments()

【讨论】:

    【解决方案5】:

    只是做

    getActivity().getFragmentManager().popBackStack();
    

    【讨论】:

      【解决方案6】:

      试试这个,它对我有用。

      public void onBackPressed() {
          if (mainLayout.isMenuShown()) {
              mainLayout.toggleMenu();
          } else {
              FragmentManager fm = getSupportFragmentManager();
              Log.print("back stack entry", fm.getBackStackEntryCount() + "");
      
              if (fm.getBackStackEntryCount() > 1) {
                  fm.popBackStack();
                  // super.onBackPressed();
                  // return;
              } else {
                  if (doubleBackToExitPressedOnce) {
                      fm.popBackStack();
                      super.onBackPressed();
                      return;
                  }
      
                  this.doubleBackToExitPressedOnce = true;
                  Toast.makeText(this, "Press one more time to exit",
                          Toast.LENGTH_SHORT).show();
      
                  new Handler().postDelayed(new Runnable() {
      
                      @Override
                      public void run() {
      
                          doubleBackToExitPressedOnce = false;
                      }
                  }, 3000);
      
              }
          }
      }
      

      【讨论】:

        【解决方案7】:

        后退按钮将按顺序遍历,其中 Fragments 为added to backstack。默认情况下,这是作为导航功能提供的。现在如果你想去特定的 Fragment,你可以从 backstack 中show it

        【讨论】:

          【解决方案8】:

          您可以通过在backStack 中添加标签来处理它。在这里查看我的答案:

          https://stackoverflow.com/a/19477957/1572408

          希望对你有帮助

          【讨论】:

            【解决方案9】:
            @Override
            public void onResume() {
            
                super.onResume();
            
                getView().setFocusableInTouchMode(true);
                getView().requestFocus();
                getView().setOnKeyListener(new View.OnKeyListener() {
                    @Override
                    public boolean onKey(View v, int keyCode, KeyEvent event) {
            
                        if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){
            
                            // replace your fragment here
            
                            return true;
            
                        }
            
                        return false;
                    }
                });
            }
            

            // 快乐编码

            【讨论】:

              【解决方案10】:

              如果你按回图像,你必须先像这样创建方法

              private void Backpresses() {
                  getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.contant_main, new Home()).commit();
              }
              

              那么当你按回图片时,你必须像这样打电话..

               back.setOnClickListener(new View.OnClickListener() {
                              @Override
                              public void onClick(View v) {
                                 Backpresses();
              
                              }
                          });
              

              对我来说很好用。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2017-08-03
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-01-17
                • 2016-10-06
                • 1970-01-01
                相关资源
                最近更新 更多