FragmentTransaction替换方法无法正常工作

时间:2015-11-27 08:21:28

标签: android android-fragments android-framelayout fragmenttransaction

我在替换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;
}

4 个答案:

答案 0 :(得分:2)

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

您正在呼叫add而不是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();

此外,在调试时使用日志<div class="item"> <!-- Item's image --> <img class="img-responsive" src="http://lorempixel.com/200/200/food/1/" alt=""> <!-- Item details --> <div class="item-dtls"> <!-- product title --> <h4><a href="#" >Lorem product</a></h4> <!-- price --> <span class="price lblue" >$23.00</span> </div> <!-- add to cart btn --> <div class="ecom bg-lblue"> <a class="btn" href="#" ">Add to cart</a> </div> </div> 会很有帮助。它可以让您知道FragmentManager中当前有多少片段,并且可以突出显示代码中的潜在问题。例如,如果每次旋转设备时计数都会增加,则表示您正在添加片段而不检查现有片段。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

我最后没有调用 commit 方法。