在我的示例中,我尝试了解片段的commitAllowingStateLoss()
和commit()
方法之间的区别。现在我知道,如果在活动保存实例后使用IllegalArgumentException
,则会显示commit()
(例如,当活动在后台时执行commit()
。)
但是出现了另一个问题,片段重叠。我不知道为什么,也无法解决问题。
我的代码如下。
在FragmentMainActivity中,有两个用于切换片段的按钮。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btn_fragment1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="fragment 1" />
<Button
android:id="@+id/btn_fragment2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="fragment 2" />
</LinearLayout>
<FrameLayout
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffffff"></FrameLayout>
带有id&#34; root&#34;的framelayout是片段的容器。
public class FragmentMainActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment_main);
findViewById(R.id.btn_fragment1).setOnClickListener(this);
findViewById(R.id.btn_fragment2).setOnClickListener(this);
}
PlusOneFragment plusOneFragment;
PlusTwoFragment plusTwoFragment;
@Override
public void onClick(View v) {
int i = v.getId();
if (i == R.id.btn_fragment1) {
findViewById(R.id.root).postDelayed(new Runnable() {
@Override
public void run() {
final FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
if (getSupportFragmentManager().findFragmentByTag("tag1") == null) {
plusOneFragment = PlusOneFragment.newInstance("1", "2");
transaction.add(R.id.root, plusOneFragment, "tag1");
} else {
plusOneFragment = (PlusOneFragment) getSupportFragmentManager().findFragmentByTag("tag1");
}
if (getSupportFragmentManager().findFragmentByTag("tag2") != null) {
plusTwoFragment = (PlusTwoFragment) getSupportFragmentManager().findFragmentByTag("tag2");
transaction.hide(plusTwoFragment);
}
transaction.show(plusOneFragment).commitAllowingStateLoss();
}
}, 3000);
} else if (i == R.id.btn_fragment2) {
findViewById(R.id.root).postDelayed(new Runnable() {
@Override
public void run() {
final FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
if (getSupportFragmentManager().findFragmentByTag("tag2") == null) {
plusTwoFragment = PlusTwoFragment.newInstance("1", "2");
transaction.add(R.id.root, plusTwoFragment, "tag2");
} else {
plusTwoFragment = (PlusTwoFragment) getSupportFragmentManager().findFragmentByTag("tag2");
}
if (getSupportFragmentManager().findFragmentByTag("tag1") != null) {
plusOneFragment = (PlusOneFragment) getSupportFragmentManager().findFragmentByTag("tag1");
transaction.hide(plusOneFragment);
}
transaction.show(plusTwoFragment).commitAllowingStateLoss();
}
}, 3000);
}
}
}
首先我点击button1显示fragment1,然后点击button2显示fragment2,它运行正常。完成这些操作后,再次单击button1,然后单击home,以便应用程序在后台运行。为了模拟低记忆场景,我然后杀了这个过程。所有这些操作都发生在3s。
最后,我从最近的记录(重新创建的活动)中打开了应用程序,发现这两个片段相互重叠。这是怎么发生的?(为什么当流程是前台时问题没有发生?)我该怎么处理这个问题呢?
答案 0 :(得分:1)
为您的片段根元素添加背景颜色(比如白色)android:background="@android:color/white"
并再次检查。
这是因为你的片段没有删除并且一个在另一个上面添加。也尝试替换方法而不是添加。例如: -
fragmentTransaction.replace("containerId", fragment);
因为它取代了布局中的前一个片段。您也可以使用
手动删除片段Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT);
if(fragment != null)
getSupportFragmentManager().beginTransaction().remove(fragment).commit();
答案 1 :(得分:0)
当片段保留在backstack中时,你必须在第二个打开时从backstack中删除第一个片段。使用popBackStack可以解决您的问题
Fragment fragment = (Fragment) YourClass.newInstance();
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.popBackStack();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.flContent, fragment);
//TODO Add to backstack
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
我希望这可以帮到你