我有一个android片段backstack的问题。这是我的情况。
//我还无法发布图片,所以我通过了链接。
正如你所看到的,我想从片段1到片段2,最后到片段3,但是当我在片段3按回按钮时,我想回到片段1。
我就像我在pic上描述的那样,但当我按下Back Button时没有任何反应,当我第二次按下它时,应用程序正在关闭。
我的BackStack看起来像预期的那样,我只有#34; Main"条目。 此外,当我添加到Backstack Fragment 2时,我可以正常从Frag3返回到Frag2到Frag1(但这不是我想要的)。
//编辑:
首先:
我稍微调试了我的应用程序,我注意到当我按下后退按钮时,片段从后台插入,他的生命周期方法被调用,但是当前片段(片段3)什么都不做(我记录了他的onPause和onStop方法,它们没有被引用)。也许这是一个问题?
第二
我找到了一个实现onBackStackChange监听器的解决方案,在onBackStacChange方法中,我只是用Fragment1替换Fragment3。这有效,但它是否正确?
答案 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片段