了解动态片段加载

时间:2014-08-03 18:56:59

标签: android dynamic android-fragments

在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()在活动生命周期中被称为不止一次,但我不知道为什么?我对活动生命周期的了解很少。

2 个答案:

答案 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的调用:)