奇怪的碎片背堆行为

时间:2015-07-06 14:20:35

标签: android android-fragments fragment-backstack

我遇到了一个activity的应用,以及基于Fragment的所有导航。我有一个地方包含下一步:

fragment1替换为容器id1; 我使用add将fragment2添加到同一个id1容器中; 在我使用replace将fragment3添加到同一个id1容器之后;

这是三个不设防的交易。所有都添加到后台堆栈。但是当我按下后,最后,片段2没有出现,我只看到容器id1上的fragmtent1,但是片段2在后面的堆栈中,因为下一个按下后退按钮没有效果片段1仍然可见,在下一次按下后退按钮片段1将被删除来自容器。

看起来在第一次按下按钮后,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();

有什么想法吗?感谢。

1 个答案:

答案 0 :(得分:1)

  

但是当我按下后,最后,片段2不会出现

因为容器id1中有两个片段。而fragment1位于fragment2之上。

  

我在容器id1上只看到fragmtent1,但是fragment2在后面的堆栈中,因为下一步按下后退按钮没有效果,fragment1仍然可见,

因为下一次按下后退按钮删除了看不见的fragment2。

简单解决方案:不要混用addreplace个交易。到处使用replace

相关问题