在Android教程的Building a Flexible UI下,示例中给出的片段实例化发生在Activitiy的onCreate()
中,如下所示:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.news_articles);
// Check that the activity is using the layout version with
// the fragment_container FrameLayout
if (findViewById(R.id.fragment_container) != null) {
...
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_container, firstFragment).commit();
}
}
不包含if (findViewById(R.id.fragment_container) != null)
检查,我自己的示例在启动时失败:
IllegalStateException:指定的子级已有父级。您必须先在孩子的父母身上调用removeView()。
我的问题是:
if检查有什么作用?我不理解教程示例中的注释说明。我的理解是,出于某种原因,onCreate()在活动生命周期中被称为不止一次,但我不知道为什么?我对活动生命周期的了解很少。
答案 0 :(得分:2)
if检查有什么作用?
检查容器是否存在。您无法将片段添加到不存在的容器中。
答案 1 :(得分:0)
简单的Navonod,
if (findViewById(R.id.**fragment_container**) != null) {
getSupportFragmentManager().beginTransaction().add(R.id.**fragment_container**,firstFragment).commit();
}
res / layout / news_articles.xml中的:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
因此,它已在应用首次调用主题时创建,这就是我们检查findViewById(R.id.fragment_container) != null
的原因。但是,如果您在应用程序运行时期间动态删除它,此代码将确保您安全地将其恢复到片段应驻留的FrameLayout中。
P.S:在这里实际上没有两次onCreate的调用:)