不能从后台堆栈
问题描述:
我有一个容器的主要活动,我想显示四个片段。这个主要活动有一个底栏,当我按下一个特定的选项卡时,它应该会膨胀不同的片段。我正在尝试使用backstack调用来使我的应用更加流畅。该代码波纹管显示为底栏listenners不能从后台堆栈
@Override
public void onTabSelected(@IdRes int tabId) {
if (tabId == R.id.tab_people) {
cretePeopleFrgament();
} else if (...) {
...
}
bottomBar.setOnTabReselectListener(new OnTabReselectListener() {
@Override
public void onTabReSelected(@IdRes int tabId) {
if (tabId == R.id.tab_people) {
cretePeopleFrgament();
} else if (...) {
...
}
}
});
}
我开始了我的片段像
void creteProfileFrgament() {
...
Fragment fraggy = new FragmentProfile();
replaceFragment(fraggy,"Profile",null);
}
所以下一个方法我想,如果我想吹大片段已经在如果是这样的话,他应该被强制而不是被创造出来。发生的事情是,当我想从后台堆栈弹出时,总是会生成从onStart传递的片段。从我debbug我已经看到他正确添加,布尔fragmentpop卡梅斯真实的,但它不是POP操作
private void replaceFragment (Fragment fragment, String name,Bundle bundle){
boolean fragmentPopped = fragmentManager.popBackStackImmediate(name,0);
if (!fragmentPopped){ //fragment not in back stack, create it.
FragmentTransaction ft= fragmentManager.beginTransaction();
ft.addToBackStack(name);
ft.replace(R.id.conteiner, fragment);
if(bundle!=null)
fragment.setArguments(bundle);
ft.commit();
}
}
这样做的目的是与onBackPressed
@Override
public void onBackPressed() {
bottomBar.setVisibility(View.VISIBLE);
int index = fragmentManager.getBackStackEntryCount() - 1;
String tag;
if(index==-1) {
tag = "default";
}else {
FragmentManager.BackStackEntry backEntry = fragmentManager.getBackStackEntryAt(index);
tag = backEntry.getName();
}
switch (tag){
case "Profile":
bottomBar.selectTabAtPosition(0);
break;
case "People":
bottomBar.selectTabAtPosition(1);
break;
case "default":
bottomBar.selectTabAtPosition(0);
}
}
很多感谢的工作
答
你每次创建一个新的Fragment,如果你想从后台弹出,你应该保留它,而不是再次创建它...
看着你的cretePr ofileFrgament mehtod。
尝试编辑您的问题,并重新措辞一些单词和标题正确 – Pulkit