这两种方法之间的真正区别是什么?
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;
}
答案 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
也可以在流程死亡和配置更改中保留。