2016-04-19 31 views
7

这两种方法的真正区别是什么?片段newInstance为什么使用参数?

1.I现在用标准的老fashined束:

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; 
} 

回答

6

在第一个例子,你还没有真正设置片段实例变量val1和val2,因此它们保持未初始化状态。因此,您需要回读onCreate中的包以设置实例变量。

当片段实例销毁和重新创建的(例如,由于一个设备旋转),所述的onCreate(或onCreateDialog用于DialogFragments)可使用重新加载的参数:

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

和您的状态可以恢复。

+0

这很现实,很愚蠢!谢谢! – Heisenberg

3

arguments束被保持在onSaveInstanceState(),而构造参数都没有。

同样,如果你没有你的领域节省出来onSaveInstanceState()在活动中发生了什么。考虑到像Intent这样的arguments捆绑包,Intent也会在进程死亡和配置更改中保留。

相关问题