片段newInstance为什么要使用参数?

时间:2016-04-19 11:37:27

标签: android android-fragments

这两种方法之间的真正区别是什么?

1.我正在使用标准的老式捆绑包:

    public static final Fragment newInstance(int val1, int val2) {
    TestFragment f = new TestFragment();
    Bundle bundle = new Bundle();
    bundle.putInt("val1", val1);
    bundle.putInt("val2", val2);
    f.setArguments(bundle);
    return f;
}

2.我正在设置为实例成员

    public static final Fragment newInstance(int val1, int val2) {
    TestFragment f = new TestFragment();
    f.val1 = val1;
    f.val2 = val2;
    return f;
}

2 个答案:

答案 0 :(得分:6)

在第一个示例中,您实际上并未设置片段实例变量val1和val2,因此它们保持未初始化状态。因此,您需要回读onCreate中的包以设置实例变量。

当碎片实例被销毁并重新创建时(例如由于设备轮换),onCreate(或DialogFragments的onCreateDialog)可以使用以下命令重新加载参数:

public void onCreate(Bundle savedInstanceState)
{
 if (savedInstanceState != null)
 {
  Bundle args = getArguments();
  val1 = args.getInt("val1");
  val2 = args.getInt("val2");
 }
}

你的州可以恢复。

答案 1 :(得分:3)

arguments包保留在onSaveInstanceState()中,而构造函数参数则不保留。

与您在活动中将字段保存到onSaveInstanceState()时的情况类似。可以将arguments捆绑包视为Intent,Intent也可以在流程死亡和配置更改中保留。