【发布时间】:2014-09-16 18:28:22
【问题描述】:
我对 android 片段还很陌生,所以请多多包涵。
我有一堆片段使用单个活动作为主机。
在我看来,我的片段是按部分分组的,尽管它们仍然是模块化/可按代码重用的。 考虑这种理想的情况:
Frag1 ->(按下一步)-> Frag2 ->(按下一步)-> Frag3 ->(按返回)-> Frag1
在浏览了一系列片段后,我想在按下后退按钮时跳过一些以前的片段(在这种情况下,跳过片段 2)。
但是,在我当前的代码中,我的问题是即使返回到 Frag1,Frag3 也不会从屏幕上消失。发生的情况是 Frag1 和 Frag3 都变得可见。
这是我的相关代码sn-ps:
用于创建 Frag1 的代码 sn-p
@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 的代码 sn-p
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 的代码 sn-p
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 会瞬间出现。
【问题讨论】: