使用片段实现后台堆栈

时间:2016-05-13 09:32:23

标签: java android android-fragments fragment-backstack

我尝试在使用片段时实现后台堆栈,但在使用“后退”按钮时,我不断从应用程序中取出到主屏幕。

活动打开片段A;片段A有一个可点击的TextView,可以打开片段B(这样可以)。点击BACK应该将我返回到片段A,但它会将我带到主屏幕。

以下是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" );

此时,日志打印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 - 但后退按钮将我返回到主屏幕。

3 个答案:

答案 0 :(得分:2)

在你的Activity中使用它会弹出已经添加到backstack的片段

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

答案 1 :(得分:0)

尝试这样,

 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);

答案 2 :(得分:0)

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