用片段实现返回栈
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();
}
}
我正在尝试在使用片段时实现返回堆栈,但在使用“返回”按钮时,我总是从应用程序转到主屏幕。
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();
}
}