我想添加到我的android应用程序后退按钮监听器,该监听器使用具有唯一值的popBackStack。 例如,我有片段1,2,3,4,5,我按1-> 2-> 3-> 2-> 3-> 4-> 3-> 5-> 3的顺序访问它们。
如果我位于队列末尾的片段3中,则后退按钮应将我备份到片段5,在此片段中,后退按钮应将我备份到片段4,在此时将我备份到片段2,在此时将我备份到片段1(3-> 5-> 4-> 2-> 1)。
我有可用的代码,但单击“后退”按钮可将我返回到该队列中的上一个片段(3-> 5-> 3-> 4-> 3-> 2-> 3-> 2-> 1)
view.setOnKeyListener((view1, keyCode, keyEvent) -> {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (popDone) {
popDone = false;
return true;
} else {
if (getActivity().getSupportFragmentManager().getBackStackEntryCount() > 0) {
popDone = true;
getActivity().getSupportFragmentManager().popBackStack();
} else {
getActivity().finish();
}
return true;
}
}
return false;
});
答案 0 :(得分:0)
后退动作不是问题,但要添加片段。阅读document有关使用片段的信息。我想您正在毫无意义地将每个片段都添加到堆栈中。每当不需要回退堆栈FragmentTransaction
fragmentTransaction.addToBackStack(null);
中的这一行
答案 1 :(得分:0)
伙计,将所有片段都添加到堆栈中,而不要重用它-这是不好的做法。当您需要打开片段时,可以在堆栈中对其进行检查。 我是这样的:
private void showFragmentIfNeeded(Fragment fragment) {
if (fragmentManager.findFragmentByTag(CURRENT_FRAGMENT_TAG) != null)
fragmentManager.beginTransaction().hide(fragmentManager.findFragmentByTag(CURRENT_FRAGMENT_TAG)).commit();
if (fragmentManager.findFragmentByTag(fragment.getClass().getSimpleName()) != null)
fragmentManager.beginTransaction().show(fragmentManager.findFragmentByTag(fragment.getClass().getSimpleName())).commit();
else
fragmentManager.beginTransaction().add(R.id.fragment_container, fragment, fragment.getClass().getSimpleName()).commit();
CURRENT_FRAGMENT_TAG = fragment.getClass().getSimpleName();
}