4

我正在研究片段,并使用文章主详细信息示例检查了此处文档中的教程。我们有 2 个片段,一个是文章标题,选择后会出现详细的文章视图(多窗格布局)。我得到了教程的大部分内容,除了一小部分,为什么他们检查 onCreate 方法中的 savedInstancestate。

所以我的问题是关于容器活动的 onCreate() 方法。它有这个检查

 if (savedInstanceState != null) {
                return;
            }

当我删除它时,片段在 ui 中重叠。所以我知道它可以防止这种情况,但我不知道为什么?我想要有人给我解释一下。

提前致谢。

编辑:完整的方法

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.news_articles);

    // Check whether the activity is using the layout version with
    // the fragment_container FrameLayout. If so, we must add the first fragment
    if (findViewById(R.id.fragment_container) != null) {

        // However, if we're being restored from a previous state,
        // then we don't need to do anything and should return or else
        // we could end up with overlapping fragments.
        if (savedInstanceState != null) {
            return;
        }

        // Create an instance of ExampleFragment
        HeadlinesFragment firstFragment = new HeadlinesFragment();

        // In case this activity was started with special instructions from an Intent,
        // pass the Intent's extras to the fragment as arguments
        firstFragment.setArguments(getIntent().getExtras());

        // Add the fragment to the 'fragment_container' FrameLayout
        getSupportFragmentManager().beginTransaction()
                .add(R.id.fragment_container, firstFragment).commit();
    }
}
4

2 回答 2

4

我得到了它。

关键是:如果活动被屏幕旋转行为破坏,活动包含的片段会自动保存。

因此,当活动从先前的状态(屏幕旋转)恢复时,再次调用 onCreate() 方法,这意味着在屏幕旋转时将再次添加片段(根据上面的代码)。所以如果我们从旋转中恢复,我们必须检查 onCreate() 方法内部,if (savedInstanceState != null) 所以不需要重新添加片段,什么都不做。

于 2013-09-10T18:05:52.390 回答
3

savedInstanceState 检查最后保存的状态。

在 android 中,每当您旋转设备或从另一个 Activity 回来时,Android 的一般生命周期都会按应有的方式开始,例如 onCreate>onStart>onResume 等等。这意味着您的整个 Activity 都是从头开始的。

但是在 savedInstanceState 中,您将获得 UI 的最后一个状态,即您已保存或正在使用的状态。

于 2013-09-10T11:23:26.620 回答