【问题标题】:Implementing back stacks with fragments使用片段实现回栈
【发布时间】:2016-05-13 09:32:23
【问题描述】:

我正在尝试在使用片段时实现后退堆栈,但是在使用后退按钮时,我不断地从应用程序中移到主屏幕。

Activity 打开片段 A;片段 A 有一个可点击的 TextView,可以打开片段 B(这有效)。点击 BACK 应该让我返回片段 A,但它会将我带到主屏幕。

这里是活动对onCreate中片段A打开的调用:

    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.add(R.id.fragment_layout_container, new FragmentLogin(), "fragment_login")
            .addToBackStack("login_screen")
            .commit();

    Log.d("Back", getFragmentManager().getBackStackEntryCount() +" <- Entry Count at LoginActivity.onCreate" );

此时,日志打印0 &lt;- Entry Count at LoginActivity.onCreate。我做错了什么使这个无法打印 1。

那么,Fragment A 就有了这个监听器:

    forgottenPassword.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.fragment_layout_container, new FragmentForgottenPassword(), "fragment_password")
                    .addToBackStack("forgotten_password")
                    .commit();

            Log.d("Back", getFragmentManager().getBackStackEntryCount() + " <- Entry Count at FragmentLogin.onCreateView.Listener");
        }
    });

这里的日志打印1 &lt;- Entry Count at FragmentLogin.onCreateView.Listener。在这里,监听器工作并打开片段 B - 但返回按钮将我返回到主屏幕。

【问题讨论】:

    标签: java android android-fragments fragment-backstack


    【解决方案1】:

    在你的 Activity 中使用它应该会弹出已经添加到 backstack 的片段

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

    【讨论】:

      【解决方案2】:

      试试这样,

       public void replaceFragment(Fragment fragment, boolean addToBackStack) {
      
          FragmentTransaction transaction = getFragmentManager()
                  .beginTransaction();
      
          if (addToBackStack) {
              transaction.addToBackStack(null);
      
          } else {
              getFragmentManager().popBackStack(null,
                      FragmentManager.POP_BACK_STACK_INCLUSIVE);
      
          }
          transaction.replace(R.id.fragment_layout_container, fragment);
          transaction.commitAllowingStateLoss();
          getFragmentManager().executePendingTransactions();
      
      }
      

      并像这样使用它,

      replaceFragment(new FragmentForgottenPassword(), true);
      

      【讨论】:

        【解决方案3】:

        有一个 GitHub 库可以为您完成这项工作!
        https://github.com/rathodchintan/Fragment-Back-Stack
        每当您显示任何新片段时,只需使用以下代码将该片段推入堆栈即可。 //这里这个片段是我们的第一个片段
        homeListFragment = 新的 HomeListFragment(); fragmentStack.push(homeListFragment);
        它还有很多其他的堆栈选项。

        【讨论】:

          猜你喜欢
          • 2011-09-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多