奇怪的 Fragments backstack 行为
Strange Fragments backstack behavior
我用一个 activity
和所有基于 Fragment
的导航来面对应用程序。我有一个地方包含后续步骤:
fragment1 在容器 id1 中被替换;
我使用 add
将 fragment2 添加到同一个 id1 容器;
在我使用 replace
将 fragment3 添加到同一 id1 容器后;
是三笔不设防的交易。全部添加到返回堆栈。但是当我按下后退时,在最后一次之后,fragment2 没有出现,我只看到容器 id1 上的 fragmtent1,但是 fragment2 在返回堆栈中,因为下一次按下后退按钮没有效果 fragment1 仍然可见,下一次按下后退按钮后 fragment1 将被删除来自容器。
看起来在第一次按下后退按钮后 fragment2 没有创建它的视图,所以他在容器上消失了。
有一部分代码是我用来替换的:
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.kp_content_frame, fragment);
if (addToBackStack) {
transaction.addToBackStack(fragment.getTag());
}
if (allowingStateLoss) {
transaction.commitAllowingStateLoss();
} else {
transaction.commit();
}
要添加:
final String tagToAdd = fragment instanceof BaseFragment ? ((BaseFragment) fragment).getCustomTag() : fragment.toString();
if(isDuplicateFragment(tagToAdd)) {
return;
}
FragmentTransaction transaction = fragmentManager.beginTransaction();
if (enterPopAnim != 0 || exitPopAnim != 0) {
transaction.setCustomAnimations(enterAnim, exitAnim, enterPopAnim, exitPopAnim);
} else if(enterAnim != 0 || exitAnim != 0) {
transaction.setCustomAnimations(enterAnim, exitAnim);
}
transaction.add(R.id.kp_content_frame, fragment, tagToAdd);
if (addToBackStack) {
transaction.addToBackStack(tagToAdd);
}
transaction.commit();
有什么想法吗?谢谢。
But when I press back, after last, fragment2 does not appear
因为你在容器id1中有两个片段。而fragment1在fragment2之上。
I see only fragmtent1 on container id1, but fragment2 is in back stack, because next pressing back button has no effect fragment1 still visible,
因为下一次按下后退按钮删除了不可见的 fragment2。
简单的解决方案:不要混合使用 add
和 replace
事务。到处使用 replace
。
我用一个 activity
和所有基于 Fragment
的导航来面对应用程序。我有一个地方包含后续步骤:
fragment1 在容器 id1 中被替换;
我使用 add
将 fragment2 添加到同一个 id1 容器;
在我使用 replace
将 fragment3 添加到同一 id1 容器后;
是三笔不设防的交易。全部添加到返回堆栈。但是当我按下后退时,在最后一次之后,fragment2 没有出现,我只看到容器 id1 上的 fragmtent1,但是 fragment2 在返回堆栈中,因为下一次按下后退按钮没有效果 fragment1 仍然可见,下一次按下后退按钮后 fragment1 将被删除来自容器。
看起来在第一次按下后退按钮后 fragment2 没有创建它的视图,所以他在容器上消失了。
有一部分代码是我用来替换的:
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.kp_content_frame, fragment);
if (addToBackStack) {
transaction.addToBackStack(fragment.getTag());
}
if (allowingStateLoss) {
transaction.commitAllowingStateLoss();
} else {
transaction.commit();
}
要添加:
final String tagToAdd = fragment instanceof BaseFragment ? ((BaseFragment) fragment).getCustomTag() : fragment.toString();
if(isDuplicateFragment(tagToAdd)) {
return;
}
FragmentTransaction transaction = fragmentManager.beginTransaction();
if (enterPopAnim != 0 || exitPopAnim != 0) {
transaction.setCustomAnimations(enterAnim, exitAnim, enterPopAnim, exitPopAnim);
} else if(enterAnim != 0 || exitAnim != 0) {
transaction.setCustomAnimations(enterAnim, exitAnim);
}
transaction.add(R.id.kp_content_frame, fragment, tagToAdd);
if (addToBackStack) {
transaction.addToBackStack(tagToAdd);
}
transaction.commit();
有什么想法吗?谢谢。
But when I press back, after last, fragment2 does not appear
因为你在容器id1中有两个片段。而fragment1在fragment2之上。
I see only fragmtent1 on container id1, but fragment2 is in back stack, because next pressing back button has no effect fragment1 still visible,
因为下一次按下后退按钮删除了不可见的 fragment2。
简单的解决方案:不要混合使用 add
和 replace
事务。到处使用 replace
。