我在替换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;
}
答案 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 方法。