3

对第一次创建片段然后重新附加到活动时在片段的回调中获得的 savedInstanceState 包有疑问。

所以我使用 setRetainInstance(true),因此片段不应该被破坏,而只是在活动被破坏时从活动中分离出来,然后在活动被重新创建时重新连接回来,例如配置更改。

所以,因为使用这个 setRetainInstance(true) 这将导致 savedInstanceState 包在片段的回调中总是为空,例如:onActivityCreated()onCreate()

到目前为止一切都很好,现在我从一些用户那里得到了一些崩溃(一个非常小的数字),这是由于这个 savedInstanceState 在片段上不是 null 引起的。

所以, onActivityCreated() 回调正在做这样的事情:

@Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        adapter = new CustomAdapter(getActivity(), getListView(), data, savedInstanceState);
        setListAdapter(adapter);
        setupEmptyListView();
        getListView().setOnScrollListener(this);
    }

CustomAdapter 在某个时候从其构造函数中调用了一个loadInstanceState()完成其工作的方法,代码如下:

@Override
    public void loadInstanceState(Bundle savedInstanceState) {
        if (savedInstanceState != null) {
         //do some stuff which is causing a crash
        }
    }

现在我的问题是,当我传递的 savedInstanceState 应该始终为空时,如何才能进入该 if 语句。

现在的问题

Android 是否保证 setRetainInstance(true) 在片段上使用时,传递给回调的 savedInstanceState 包总是为空?

谢谢你们的回答!

4

1 回答 1

1

在这种情况下,我没有发现任何提及 savedInstanceState 捆绑包必须为空。官方文档说:

公共无效 setRetainInstance(布尔保留)

控制是否在 Activity 重新创建期间(例如从配置更改)保留片段实例。这只能与不在后台堆栈中的片段一起使用。如果设置,片段生命周期将在重新创建活动时略有不同:

onDestroy() 将不会被调用(但 onDetach() 仍然会被调用,因为片段正在与其当前活动分离)。

onCreate(Bundle) 不会被调用,因为片段没有被重新创建。

onAttach(Activity) 和onActivityCreated(Bundle) 仍将被调用。

恕我直言,这是主要区别 - 改变了生命周期。

于 2013-03-21T11:11:59.423 回答