【问题标题】:Back from third to first fragment in android在android中从第三个片段返回到第一个片段
【发布时间】:2015-05-28 09:46:44
【问题描述】:

我有一个关于 android 片段 backstack 的问题。这是我的情况。

// 我还不能发布图片,所以我传递了一个链接。

如您所见,我想从 Fragment 1 转到 Fragment 2,最后再转到 Fragment 3,但是当我在 Fragment 3 按下返回按钮时,我想返回 Fragment 1。

我按照图片上的描述执行此操作,但是当我按下返回按钮时没有任何反应,当我第二次按下它时,应用程序正在关闭。

我的 BackStack 看起来像预期的那样,我只有“主要”条目。 另外,当我添加到 backstack Fragment 2 时,我可以从 Frag3 正常返回到 Frag2 到 Frag1(但这不是我想要的)。

//编辑:

第一:

我稍微调试一下我的应用程序,我注意到当我按下后退按钮时,Fragment 从 backstack 中弹出并调用了他的生命周期方法,但当前的 Fragment(Fragment 3)什么都不做(我记录了他的 onPause 和 onStop 方法和他们没有被调用)。也许这是个问题?

第二:

我找到了一个解决方案,我实现了 onBackStackChange 侦听器,在 onBackStacChange 方法中,我只需将 Fragment3 替换为 Fragment1。这行得通,但它正确吗?

【问题讨论】:

标签: android android-fragments back-stack


【解决方案1】:

使用....

FragmentManager fmManager = activity.getSupportFragmentManager();
if (fmManager.getBackStackEntryCount() > 0) { fmManager.popBackStack(fmManager.getBackStackEntryAt(fmManager.getBackStackEntryCount()-2).getId(), fmManager.POP_BACK_STACK_INCLUSIVE); } 

-2是因为你要往后退两个2片段

【讨论】:

    【解决方案2】:
    @Override
    public void onPageScrollStateChanged(int state) {
       int currentPage = mChannelPager.getCurrentItem();
       if (currentPage == mChannelsList.size() - 1 || currentPage == 0) {
              previousState = currentState;
              currentState = state;
              if (previousState == 1 && currentState == 0) {
                  mChannelPager.setCurrentItem((currentPage == 0 ? mChannelsList.size() - 1 : 0), false);
                }
            }
         }
    });
    

    在你的 onPageChangeListner 的 onPageScrollStateChanged(int state) 中写下这段代码

    【讨论】:

      【解决方案3】:

      1) 使用以下代码添加第一个片段

      android.support.v4.app.FragmentManager fm = getActivity().getSupportFragmentManager();
              android.support.v4.app.FragmentTransaction ft=fm.beginTransaction();
              if (fm.findFragmentById(R.id.fragment_container) != null) {
                  ft.hide(fm.findFragmentById(R.id.fragment_container));
              }
              ft.add(R.id.fragment_container, new OneFragment(),OneFragment.class.getCanonicalName())
                      .addToBackStack(OneFragment.class.getCanonicalName()).commit();
      

      2) 使用以下代码从第一个片段添加第二个片段

        android.support.v4.app.FragmentManager fm = getActivity().getSupportFragmentManager();
                          android.support.v4.app.FragmentTransaction ft=fm.beginTransaction();
                          if (fm.findFragmentById(R.id.fragment_container) != null) {
                              ft.hide(fm.findFragmentById(R.id.fragment_container));
                          }
                          ft.add(R.id.fragment_container,new TwoFragment(),TwoFragment.class.getCanonicalName())
      .addToBackStack(TwoFragment.class.getCanonicalName()).commit();
      

      3) 使用以下代码从第二个片段添加第三个片段

      android.support.v4.app.FragmentManager fm = getActivity().getSupportFragmentManager();
                      android.support.v4.app.FragmentTransaction ft=fm.beginTransaction();
                      if (fm.findFragmentById(R.id.fragment_container) != null) {
                          ft.hide(fm.findFragmentById(R.id.fragment_container));
                      }
                      ft.add(R.id.fragment_container, new ThreeFragment(),ThreeFragment.class.getCanonicalName())
                              .addToBackStack(ThreeFragment.class.getCanonicalName()).commit();
      

      4) onBackPressed() 请写下代码

      @Override
          public void onBackPressed() {
              hideKeyboard(MainActivity.this);
              Fragment currentFragment = this.getSupportFragmentManager().findFragmentById(R.id.fragment_container);
      
              if (currentFragment.getClass().getName().equalsIgnoreCase(ThreeFragment.class.getName())) { // Using this code come from third fragment to first fragment
                  Fragment f = this.getSupportFragmentManager().findFragmentByTag(TwoFragment.class.getCanonicalName());
                  if (f != null) {
                      this.getSupportFragmentManager().popBackStackImmediate(f.getClass().getCanonicalName(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
                  }
              }else {
                  super.onBackPressed();
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多