我尝试在使用片段时实现后台堆栈,但在使用“后退”按钮时,我不断从应用程序中取出到主屏幕。
活动打开片段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 - 但后退按钮将我返回到主屏幕。
答案 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);
它还有许多其他堆栈选项。