我在这里遵循教程: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。我相信这是由于片段以已保存的即时状态存在。这是正确的吗?如果是这样,是否意味着本教程不正确?
答案 0 :(得分:1)
在配置更改(例如轮换)期间,Activity
将保存的内容(实际上是活动的FragmentManager
)为Fragment
s。
通常,这不会引起任何问题,因为在任何方向上都使用相同的片段。但是在主/细节屏幕中,细节片段仅在横向方向上可见,您可能会遇到问题。
首次创建详细片段(旋转到横向时),该片段将存在FragmentManager中,直到您退出活动为止。即使旋转回纵向也是如此。但是,在您的活动布局不包含该详细信息片段的情况下,不会添加。
因此您可以从以下位置更改支票:
if (articleFrag != null)
到
if (articleFrag != null && articleFrag.isAdded())