【问题标题】:FragmentTransaction replace method doesn't work properlyFragmentTransaction 替换方法无法正常工作
【发布时间】:2015-11-27 08:21:27
【问题描述】:

我在替换 FrameLayout 容器中的片段时遇到了错误。 当应用程序第一次启动时一切正常,但是当我隐藏应用程序然后恢复时,当调用FragmentTransaction.replace 方法时片段开始相互重叠

我已经看过几乎所有关于此类问题的 stackoverflow 问题,但我无法解决此问题

代码:

<FrameLayout
   android:id="@+id/frame"
   android:layout_width="match_parent"
   android:layout_height="match_parent">
</FrameLayout>

添加初始片段:

getSupportFragmentManager().beginTransaction()
                    .add(R.id.frame, RequestFragment.newInstance(), REQUEST_FRAGMENT_TAG)
                    .commit();

替换:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
switch (menuItem.getItemId()) {
    case R.id.request:
        ft.replace(R.id.frame, RequestFragment.newInstance(), REQUEST_FRAGMENT_TAG);
        ft.commit();
        return true;
    case R.id.finished:
        ft.replace(R.id.frame, FinishedFragment.newInstance(), FINISHED_FRAGMENT_TAG);
        ft.commit();
        return true;
    case R.id.questions:
        ft.replace(R.id.frame, QuestionsFragment.newInstance(), QUESTIONS_FRAGMENT_TAG);
        ft.commit();
        return true;
    default:
        return true;
}

【问题讨论】:

    标签: android android-fragments android-framelayout fragmenttransaction


    【解决方案1】:

    很难说,因为您的代码没有提供运行时间的上下文,但我怀疑问题出在您添加初始片段时。

    您正在调用add 而不是replace,这只会将新片段添加到任何现有片段之上。即使容器还没有包含任何东西,也可以使用 replace 。

    片段在FragmentManager 中存活,并在Activity 重新启动时自动重新附加到其容器。正确的过程是在添加新的Fragment 之前检查现有的@。

    添加初始片段

    Fragment f=getSupportFragmentManager().findFragmentById(R.id.frame);
    
    if (f==null) {
        getSupportFragmentManager().beginTransaction()
         .replace(R.id.frame, RequestFragment.newInstance(), REQUEST_FRAGMENT_TAG).commit();
    
    }
    

    此外,在调试时使用日志记录 getSupportFragmentManager().getFragments().size(); 也很有帮助。它可以让您知道 FragmentManager 中当前有多少片段,并且可以突出显示代码中的潜在问题。例如,如果每次旋转设备时计数都会增加,那么您就是在添加片段而不是检查现有片段。

    【讨论】:

      【解决方案2】:

      尝试使用 FragmentTransaction.commitAllowingStateLoss() 而不是 commit()

      【讨论】:

      • 您能提供原因吗?
      【解决方案3】:

      这有时会因为片段背景而发生。尝试为堆栈中的所有片段设置纯色背景,使其不为空或设置为@null。

      【讨论】:

        【解决方案4】:

        最后我没有调用 commit 方法。

        【讨论】:

          猜你喜欢
          • 2018-02-28
          • 1970-01-01
          • 2021-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-02
          • 2021-12-29
          相关资源
          最近更新 更多