在android

时间:2015-05-28 09:46:45

标签: android android-fragments back-stack

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

enter image description here

//我还无法发布图片,所以我通过了链接。

正如你所看到的,我想从片段1到片段2,最后到片段3,但是当我在片段3按回按钮时,我想回到片段1。

我就像我在pic上描述的那样,但当我按下Back Button时没有任何反应,当我第二次按下它时,应用程序正在关闭。

我的BackStack看起来像预期的那样,我只有#34; Main"条目。 此外,当我添加到Backstack Fragment 2时,我可以正常从Frag3返回到Frag2到Frag1(但这不是我想要的)。

//编辑:

首先:

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

第二

我找到了一个实现onBackStackChange监听器的解决方案,在onBackStacChange方法中,我只是用Fragment1替换Fragment3。这有效,但它是否正确?

3 个答案:

答案 0 :(得分:0)

@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)

答案 1 :(得分:0)

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();
        }
    }

答案 2 :(得分:0)

使用......

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

-2是因为您想退回两个2片段