尽管不在布局中,但仍在创建片段

时间:2018-09-28 19:15:45

标签: android android-fragments

我在这里遵循教程:https://developer.android.com/training/basics/fragments/communicating,并且在将设备旋转至横向,纵向,然后回到横向时遇到崩溃。崩溃发生在以下代码段中。

public void onArticleSelected(int position) {
    ArticleFragment articleFrag = (ArticleFragment)
   getSupportFragmentManager()
       .findFragmentById(R.id.article_fragment);

        if (articleFrag != null) {
         // Crash happens here.
            articleFrag.updateArticleView(position);
        } else {
         //...
        }
    }
}

这样做的原因是,当应用程序旋转回纵向时,片段管理器将返回一个片段,尽管该片段不在纵向布局中。为了对此进行调查,我创建了一个小型应用程序,其中包含如下所示的水平布局:

<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.matt.personfragments.PersonListFragment"
          android:id="@+id/person_list"
          android:layout_weight="1"
          android:layout_width="0dp"
          android:layout_height="match_parent" />

    <fragment android:name="com.example.matt.personfragments.PersonDetailFragment"
          android:id="@+id/person_detail"
          android:layout_weight="1"
          android:layout_width="0dp"
          android:layout_height="match_parent" />
</LinearLayout>

和如下所示的纵向布局:

<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.matt.personfragments.PersonListFragment"
          android:id="@+id/person_list"
          android:layout_weight="1"
          android:layout_width="0dp"
          android:layout_height="match_parent" />

</LinearLayout>

我已经重写了两个片段中的构造函数以记录它们的创建。 不出所料,首次创建应用程序时,我看到正在创建PersonListFragment。旋转设备时,我同时看到PersonListFragment和PersonDetailFragment。到目前为止一切正常。

但是,当我将设备旋转回纵向时,我看到再次创建了PersonListFragment和PersonDetailFragment。我相信这是由于片段以已保存的即时状态存在。这是正确的吗?如果是这样,是否意味着本教程不正确?

1 个答案:

答案 0 :(得分:1)

在配置更改(例如轮换)期间,Activity将保存的内容(实际上是活动的FragmentManager)为Fragment s。

通常,这不会引起任何问题,因为在任何方向上都使用相同的片段。但是在主/细节屏幕中,细节片段仅在横向方向上可见,您可能会遇到问题。

首次创建详细片段(旋转到横向时),该片段将存在FragmentManager中,直到您退出活动为止。即使旋转回纵向也是如此。但是,在您的活动布局不包含该详细信息片段的情况下,不会添加

因此您可以从以下位置更改支票:

if (articleFrag != null)

if (articleFrag != null && articleFrag.isAdded())