我对 android fragments 还很陌生,所以请多多包涵。
我有一堆使用单个 Activity 作为宿主的 fragment 。
在我看来,我的 fragment 是按部分分组的,尽管它们仍然是模块化的/可按代码重用。 考虑这个理想的场景:
Frag1 -> (Press Next) -> Frag2 -> (Press Next) -> Frag3 -> (Press Back) -> Frag1
在浏览了一系列 fragment 之后,我想在按下后退按钮时跳过之前的一些 fragment (在这种情况下,跳过 fragment 2)。
但是,在我当前的代码中,我的问题是即使它返回到 Frag1,Frag3 也不会从屏幕上消失。发生的情况是 Frag1 和 Frag3 变得可见。
这是我的相关代码 fragment :
创建 Frag1 的代码 fragment
@Override
public void onNavigationDrawerItemSelected(int position) {
// update the main content by replacing fragments
// init the fragment (with a default fragment, not null)
Fragment fragment = PlaceholderFragment.newInstance(position + 1);
// Position number from navigation sidebar starts from 0.
// Since position starts from 0, add 1 to match section number
// as implemented in {@link #onSectionAttached()}
switch(position) {
case 0:
fragment = PlaceholderFragment.newInstance(position + 1);
break;
case 1: // Frag1 case
fragment = new AddPointsFragment().newInstance(position + 1, "");
break;
default:
break;
}
// update the main content by replacing fragments
FragmentManager fragmentManager = getFragmentManager();
// clear all fragments from previous section from the back stack
fragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
// replace all currently added fragments in container and replace with the new fragment
fragmentManager.beginTransaction()
.replace(R.id.container, fragment)
.commit();
}
创建 Frag2 的代码 fragment
public void onEnterButtonFragmentInteraction(int sectionNumber, String cardNo) {
// TODO: Add point for given card number
int points = 5; //sample points
AddPointsSuccessFragment addPointsSuccessFragment =
new AddPointsSuccessFragment().newInstance(sectionNumber, cardNo, points);
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.container, addPointsSuccessFragment)
.addToBackStack(null)
.commit();
}
创建 Frag3 的代码 fragment
public void onOkButtonFragmentInteraction(int sectionNumber, String cardNo, int points) {
RedeemRewardFragment redeemRewardFragment =
new RedeemRewardFragment().newInstance(sectionNumber, cardNo, points);
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.container, redeemRewardFragment);
fragmentTransaction.commit();
}
我目前的解决方法是在创建 Frag3 并运行此代码时添加 .addToBackStack(null)
public void onBackButtonFragmentInteraction() {
this.onBackPressed(); // simulate pressing of activity back button
FragmentManager fragmentmanager = getFragmentManager();
fragmentmanager.popBackStack(); // pop Frag2 from back stack
}
在调用 onBackPressed() 方法之后。不幸的是,这种解决方法很难看,因为在转到 Frag1 之前 Frag2 会瞬间出现。
最佳答案
所以你的解决方案的关键是这个人:
.addToBackStack(null)
您可以为该特定交易传入一个字符串标识符,而不是 null——例如, fragment 的类名就是我们使用的名称(尽管如果您在同一 fragment 上有多个实例,那将不起作用后台):
.addToBackStack(Fragment1.class.getName())
然后,如果您想从 Fragment3
返回到 Fragment1
,只需使用下一个 fragment 的标识符弹出,并传递 INCLUSIVE
标志(这意味着它还将弹出您指定的下一个 fragment ):
getFragmentManager().popBackStack(
Fragment2.class.getName(),
FragmentManager.POP_BACK_STACK_INCLUSIVE);
它将按预期播放您的动画,但就好像中间的 fragment 从未存在过一样。我建议使用 next fragment 的原因是因为您可能不希望在返回堆栈上进行第一个 fragment 事务。
关于android - 在 BackPressed 上跳过一些 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25875975/