用片段实现返回栈

Implementing back stacks with fragments

我正在尝试在使用片段时实现返回堆栈,但在使用“返回”按钮时,我总是从应用程序转到主屏幕。

Activity 打开片段A;片段 A 有一个可点击的 TextView,可打开片段 B(这有效)。按 BACK 应该 return 我可以分割 A,但它会将我带到主屏幕。

这里是 activity 对 onCreate 片段 A 开头的调用:

    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.add(R.id.fragment_layout_container, new FragmentLogin(), "fragment_login")
            .addToBackStack("login_screen")
            .commit();

    Log.d("Back", getFragmentManager().getBackStackEntryCount() +" <- Entry Count at LoginActivity.onCreate" );

此时Log打印0 <- Entry Count at LoginActivity.onCreate。我做错了什么使它无法打印 1.

然后,片段 A 有这个侦听器:

    forgottenPassword.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.fragment_layout_container, new FragmentForgottenPassword(), "fragment_password")
                    .addToBackStack("forgotten_password")
                    .commit();

            Log.d("Back", getFragmentManager().getBackStackEntryCount() + " <- Entry Count at FragmentLogin.onCreateView.Listener");
        }
    });

此处的日志打印 1 <- Entry Count at FragmentLogin.onCreateView.Listener。在这里,侦听器工作并打开片段 B - 但后退按钮 return 将我带到主屏幕。

像这样尝试,

 public void replaceFragment(Fragment fragment, boolean addToBackStack) {

    FragmentTransaction transaction = getFragmentManager()
            .beginTransaction();

    if (addToBackStack) {
        transaction.addToBackStack(null);

    } else {
        getFragmentManager().popBackStack(null,
                FragmentManager.POP_BACK_STACK_INCLUSIVE);

    }
    transaction.replace(R.id.fragment_layout_container, fragment);
    transaction.commitAllowingStateLoss();
    getFragmentManager().executePendingTransactions();

}

并像这样使用它,

replaceFragment(new FragmentForgottenPassword(), true);

有一个 GitHub 库可以为您完成这项工作!
https://github.com/rathodchintan/Fragment-Back-Stack
每当您显示任何新片段时,只需将该片段推入使用以下代码堆叠。 //这里这个片段是我们的第一个片段
homeListFragment = new HomeListFragment(); fragmentStack.push(homeListFragment);
它还有许多其他堆栈选项。

在你的 Activity 中使用它应该弹出已经添加到后台堆栈的片段

 @Override
 public void onBackPressed()
 {
     if (getFragmentManager().getBackStackEntryCount() > 0) {
         getFragmentManager().popBackStack();
     } else {
         super.onBackPressed();
     }
 }