屏幕方向改变后,Android片段以错误的顺序添加

3
我在自定义的Fragment转换动画过程中,遇到了屏幕方向改变后片段排序的问题。
如果我在恰好合适的时间旋转屏幕,那么片段会被添加,而MyFragment2会处于本应该是MyFragment1的位置。
我按照以下方式添加我的片段:
final FragmentManager fm = activity.get().getFragmentManager();
final FragmentTransaction ft = fm.beginTransaction();

ft.setCustomAnimations(
        R.animator.slide_in_left,
        R.animator.slide_out_top,
        R.animator.slide_in_bottom,
        R.animator.slide_out_right);

ft.replace(R.id.container,
        MyFragment1.newInstance(), MyFragment1.TAG);

ft.add(R.id.container,
        MyFragment2.newInstance(),MyFragment12.TAG)
        .addToBackStack(null)
        .commit();

我已经花费了很多时间搜索有关这个问题的信息。我在这里看到了一些信息:Android multiple fragment transaction ordering,以及https://code.google.com/p/android/issues/detail?id=69403&thanks=69403&ts=1399482444https://code.google.com/p/android/issues/detail?id=31116

我的理解是这是在一个Activity的onResume()期间重新添加Fragment时的一个错误。

如何防止我的Activity在恢复时错误地排序我的Fragments?

我的Activity布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity"
tools:ignore="MergeRootFrame" />

如何按照想要的顺序在XML中添加片段? - rahul.ramanujam
你的意思是预先将它们添加到主布局中吗?目前我的活动不包含任何布局信息。我通过编程方式交换片段,并且布局在它们自己的布局文件中单独描述。问题只会在方向更改期间出现。 - Tim Ashton
使用<fragment>标签在活动中对碎片进行排序。 - rahul.ramanujam
好的,我会尝试一下。谢谢。 - Tim Ashton
2个回答

2
我曾经遇到过同样的问题,以下的解决方法对我有所帮助:
@Override
public void onResume() {
    super.onResume();

    bringToFrontIfNeeded();
}

@Override
public void onBackStackChanged() {
    bringToFrontIfNeeded();
}

private void bringToFrontIfNeeded() {
    // A fix for a weird google bug
    if (amIOnTop() && (getView() != null)) {
        getView().bringToFront();
    }
}

private void amIOnTop() {
    // depends on you app logic, can be something like
    FragmentManager manager = getFragmentManager();
    int count = manager.getBackStackEntryCount();
    return (BACK_STACK_ENTRY_NAME.equals(manager.getBackStackEntryAt(count - 1).getName()));

}

很好,谢谢。我已经有一段时间没有处理这个问题了,但是这是最好的解决方案。 - Tim Ashton

0
尝试在活动的 XML 布局中添加片段。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <fragment android:name="com.example.android.fragments.HeadlinesFragment"
              android:id="@+id/headlines_fragment"
              android:layout_weight="1"
              android:layout_width="0dp"
              android:layout_height="match_parent" />

    <fragment android:name="com.example.android.fragments.ArticleFragment"
              android:id="@+id/article_fragment"
              android:layout_weight="2"
              android:layout_width="0dp"
              android:layout_height="match_parent" />

</LinearLayout>

我只有一个片段在开始,所以我不想在我的Activity布局中定义2个静态片段。 - Tim Ashton
你是如何添加容器的?你使用的是哪种容器? - rahul.ramanujam
使用FragmentManager和FragmentTransaction。 - Tim Ashton
你的 R.id.container 是什么?FrameLayout、LinearLayout 还是 RelativeLayout? - rahul.ramanujam
我正在使用LinearLayout。 - Tim Ashton
这个链接 https://code.google.com/p/android/issues/detail?id=31116 显示了根本原因。但是我不知道该如何解决它。 - Tim Ashton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接