片段不会从后台弹出?
Fragment does not pop out from backstack?
我有三个片段 A、B 和 C
这是路径:A -> B -> C:A 转到 B 和 B 转到至 C
当我从片段 C 返回时,我想转到片段 A。
- A <- C : C 回到根片段 A
- A <- B : B 回到根片段 A
但我的问题是当我在片段 C 中按下时,我得到了这个行为:似乎片段 C 没有从后台清除:
至于我的代码,这是 replaceFragment 的方法:
public void replaceFragment(Fragment fragment, boolean withBackStack) {
android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
String fragmentTag = fragment.getClass().getName();
fragmentTransaction.replace(R.id.frame, fragment, fragmentTag);
if (withBackStack)
fragmentTransaction.addToBackStack(fragmentTag);
try {
fragmentTransaction.commitAllowingStateLoss();
} catch (IllegalStateException ex) {
ex.printStackTrace();
}
}
首先我在 MainActivity
中调用了 replaceFragment(new AFragment(), false);
,然后在 片段 A 中单击按钮时,我调用了 mListener.replaceFragment(new BFragment(), true);
最后,在 Fragment B 中单击按钮时,我调用了 mListener.replaceFragment(new CFragment(), false);
有人对此行为有解释吗?当我单击 backpressed 时,不应清除最后一个片段 C 吗?
Here ,你会找到整个例子。
提前致谢!
因为当 backpressed 不会弹出存储的事务时你没有将 fragC 添加到 backstack 它不是 removed.instead 这里你必须通过覆盖 backpress.Overiride backpress 来删除片段并检查 fragC 和删除它然后调用 pospstack 弹出存储的事务。
还将片段的实例存储为全局以检查片段是否为 fragC。
private Fragment mFragment;
在你的方法中存储实例
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
Fragment fragment = getSupportFragmentManager().findFragmentByTag(mFragment.getClass().getName());
if (fragment != null && fragment.getClass().getName().equalsIgnoreCase(CFragment.class.getName())) {
getSupportFragmentManager().beginTransaction().remove(mFragment).commit();
}
getSupportFragmentManager().popBackStackImmediate();
} else {
super.onBackPressed();
}
}
根据@Anonymous的回答,我找到了这个问题的通用解决方案:
@Override
public void onBackPressed() {
Fragment currentFragment= getSupportFragmentManager().findFragmentById(R.id.frame);
super.onBackPressed();
if(currentFragment!=null && currentFragment.isVisible()) {
getSupportFragmentManager().beginTransaction().remove(currentFragment).commit();
getSupportFragmentManager().popBackStack(currentFragment.getTag(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
}
我有三个片段 A、B 和 C
当我从片段 C 返回时,我想转到片段 A。
- A <- C : C 回到根片段 A
- A <- B : B 回到根片段 A
但我的问题是当我在片段 C 中按下时,我得到了这个行为:似乎片段 C 没有从后台清除:
至于我的代码,这是 replaceFragment 的方法:
public void replaceFragment(Fragment fragment, boolean withBackStack) {
android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
String fragmentTag = fragment.getClass().getName();
fragmentTransaction.replace(R.id.frame, fragment, fragmentTag);
if (withBackStack)
fragmentTransaction.addToBackStack(fragmentTag);
try {
fragmentTransaction.commitAllowingStateLoss();
} catch (IllegalStateException ex) {
ex.printStackTrace();
}
}
首先我在 MainActivity
中调用了 replaceFragment(new AFragment(), false);
,然后在 片段 A 中单击按钮时,我调用了 mListener.replaceFragment(new BFragment(), true);
最后,在 Fragment B 中单击按钮时,我调用了 mListener.replaceFragment(new CFragment(), false);
有人对此行为有解释吗?当我单击 backpressed 时,不应清除最后一个片段 C 吗?
Here ,你会找到整个例子。 提前致谢!
因为当 backpressed 不会弹出存储的事务时你没有将 fragC 添加到 backstack 它不是 removed.instead 这里你必须通过覆盖 backpress.Overiride backpress 来删除片段并检查 fragC 和删除它然后调用 pospstack 弹出存储的事务。
还将片段的实例存储为全局以检查片段是否为 fragC。
private Fragment mFragment;
在你的方法中存储实例
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
Fragment fragment = getSupportFragmentManager().findFragmentByTag(mFragment.getClass().getName());
if (fragment != null && fragment.getClass().getName().equalsIgnoreCase(CFragment.class.getName())) {
getSupportFragmentManager().beginTransaction().remove(mFragment).commit();
}
getSupportFragmentManager().popBackStackImmediate();
} else {
super.onBackPressed();
}
}
根据@Anonymous的回答,我找到了这个问题的通用解决方案:
@Override
public void onBackPressed() {
Fragment currentFragment= getSupportFragmentManager().findFragmentById(R.id.frame);
super.onBackPressed();
if(currentFragment!=null && currentFragment.isVisible()) {
getSupportFragmentManager().beginTransaction().remove(currentFragment).commit();
getSupportFragmentManager().popBackStack(currentFragment.getTag(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
}