【发布时间】:2016-11-30 07:12:30
【问题描述】:
我有片段 A,B,C,D,E 并且导航流程是 A->B->C->D->E 。所以你可以说 A 是导航开始的基础片段。
导航流程
Add fragment with Backstack Navigate to Fragment A
A E
-> B (Add B to backstack) -> D (Remove E from backstack)
B D
-> C (Add C to backstack) -> C (Remove D from backstack)
C C
-> D (Add D to backstack) -> B (Remove C from backstack)
D B
-> E (Add E to backstack) -> A (Remove B from backstack)
** Trying to back from A and message pops
(Press once again to exit!)
添加带有 backstack 的片段
public void pushFragmentWithBackState(Fragment DestinationFragment) throws Exception {
try {
Fragment SourceFragment = this;
int viewResourceID = ((ViewGroup) SourceFragment.getView().getParent()).getId();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit);
ft.add(viewResourceID, DestinationFragment);
ft.hide(SourceFragment);
ft.addToBackStack(DestinationFragment.getClass().getName());
ft.commit();
} catch (Exception ex) {
throw ex;
}
}
返回片段 A (选中导航到片段 A)
在这段代码中,我正在检查片段管理器中是否没有返回堆栈条目,这意味着我们在片段 A 上,并且我正在显示消息再次按下退出或只是从片段返回。
@Override
public void onBackPressed() {
// code here to show dialog
//super.onBackPressed(); // optional depending on your needs
if (getSupportFragmentManager().getBackStackEntryCount() >= 1) {
BaseFragment fragment = (BaseFragment) getSupportFragmentManager().getFragments().get(getSupportFragmentManager().getBackStackEntryCount() - 1);
if (fragment != null) {
if (!fragment.onFragmentBackPressed()) {
//super.onBackPressed();
if (back_pressed + 2000 > System.currentTimeMillis()) {
finish();
} else {
Toast.makeText(getBaseContext(), "Press once again to exit!", Toast.LENGTH_SHORT).show();
back_pressed = System.currentTimeMillis();
}
}
} else {
//super.onBackPressed();
if (back_pressed + 2000 > System.currentTimeMillis()) {
finish();
} else {
Toast.makeText(getBaseContext(), "Press once again to exit!", Toast.LENGTH_SHORT).show();
back_pressed = System.currentTimeMillis();
}
}
} else {
if (back_pressed + 2000 > System.currentTimeMillis()) {
finish();
} else {
Toast.makeText(getBaseContext(), "Press once again to exit!", Toast.LENGTH_SHORT).show();
back_pressed = System.currentTimeMillis();
}
}
}
问题
如果我尝试从 E -> B 导航并删除所有堆栈独占
来自片段 E
poptoBackStackFragment(B.class);
方法
public boolean poptoBackStackFragment(Class SourceFragmentClass) {
getFragmentManager().popBackStack(SourceFragmentClass.getName(),0);
return true;
}
当我尝试这样做时,它不会从fragment manager 中清除片段列表(getSupportFragmentManager().getFragments()),并且位置错误,并且当再次为 ex 推送流量时。 B->C->D片段列表是这样的:
在返回片段 A 中找到这个
BaseFragment fragment = (BaseFragment) getSupportFragmentManager().getFragments().get(getSupportFragmentManager().getBackStackEntryCount() - 1);
例子:
- 片段列表 1 位置有 B 片段
- 片段列表4位置有C片段
- 片段列表3位置有D片段
- 片段列表大小也是 5 而不是 2
- 在列表中添加片段没有顺序。通常它应该是位置 0,1,2 但它是 1,4,3
因此,我检查我是否在基本片段上的逻辑失败并且即使我不在开始片段上也会出现消息(再次按下退出)。
当我导航到 B 并删除所有片段到堆栈时,为什么片段列表不清晰? 我错过了什么吗?请帮忙。
注意:我还使用 FragmentManager.POP_BACK_STACK_INCLUSIVE 将其从堆栈中清除,但出现了同样的问题。
【问题讨论】:
标签: android android-fragments fragment-backstack