32

我真的对片段的内部状态感到困惑。我有一个 Activity 一次只持有一个 Fragment 并替换它,如果应该显示另一个 Fragment。只有在调用Activity时才onSaveInstanceState调用文档(在我的情况下没有调用)。onSaveInstanceState

如果我停止我的 Fragment,我会自己将它的状态存储在 Singleton 中(是的,我知道我也讨厌 Singleton,但我不想这样做)。所以我必须重新创建整体ViewHirarchy,创建新视图(通过使用关键字new),恢复其状态并将它们返回到onCreateView. 我在这个视图中也有一个复选框,我明确不想从中存储它的状态。

然而,FragmentManager想要“智能”并onViewStateRestored使用我从未创建过的 Bundle 调用,并“恢复”旧的状态CheckBox并将其应用于我的 NEW CheckBox。这引发了很多问题:

我可以控制捆绑包onViewStateRestored吗?

FragmentManager 如何获取(可能是垃圾收集的)复选框的状态并将其应用于新复选框?

为什么它只保存 Checkbox 的状态(不是 TextViews 的??)

所以总结一下:如何onViewStateRestored工作?

注意我使用的是 Fragmentv4,所以不需要 API > 17onViewStateRestored

4

1 回答 1

36

好吧,有时片段会让人有些困惑,但过一段时间你就会习惯它们,并知道它们毕竟是你的朋友。

如果在片段的 onCreate() 方法上,您可以: setRetainInstance(true); 您的视图的可见状态将被保留,否则不会。

假设 F 类的一个名为“f”的片段,它的生命周期将如下所示: - 当实例化/附加/显示它时,这些是 f 的方法被调用,按以下顺序:

F.newInstance();
F();
F.onCreate();
F.onCreateView();
F.onViewStateRestored;
F.onResume();

此时,您的片段将在屏幕上可见。假设设备是旋转的,因此必须保留片段信息,这是由旋转触发的事件流:

F.onSaveInstanceState(); //save your info, before the fragment is destroyed, HERE YOU CAN CONTROL THE SAVED BUNDLE, CHECK EXAMPLE BELLOW.
F.onDestroyView(); //destroy any extra allocations your have made
//here starts f's restore process
F.onCreateView(); //f's view will be recreated
F.onViewStateRestored(); //load your info and restore the state of f's view
F.onResume(); //this method is called when your fragment is restoring its focus, sometimes you will need to insert some code here.


//store the information using the correct types, according to your variables.
@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putSerializable("foo", this.foo);
    outState.putBoolean("bar", true);
}

@Override
public void onViewStateRestored(Bundle inState) {
    super.onViewStateRestored(inState);
    if(inState!=null) {
        if (inState.getBoolean("bar", false)) {
            this.foo = (ArrayList<HashMap<String, Double>>) inState.getSerializable("foo");
        }
    }

}
于 2015-08-28T13:26:08.153 回答