2013-08-01 130 views
0

我开始在android中使用片段,但我怀疑:1.-是否有必要使用这部分代码(newInstance,setArguments)?,如果是这样,为什么?Android - fragments

public static class DetailsFragment extends Fragment { 
/** 
* Create a new instance of DetailsFragment, initialized to 
* show the text at 'index'. 
*/ 
public static DetailsFragment newInstance(int index) { 
    DetailsFragment f = new DetailsFragment(); 

    // Supply index input as an argument. 
    Bundle args = new Bundle(); 
    args.putInt("index", index); 
    f.setArguments(args); 

    return f; 
} 

public int getShownIndex() { 
    return getArguments().getInt("index", 0); 
} 

http://developer.android.com/reference/android/os/Bundle.html

2,如果这个代码将有一个onCreate方法,什么时候才能被称为?

回答

2

1)为什么需要newInstance?需要

newInstance方法,因为框架鼓励你永远只能有一个构造函数,没有参数。有不止一个构造函数是有点皱眉。

它需要此构造函数是公开的,所以当,例如,您经历配置变化可以重新创建你的碎片。你传递给setArguments原始同样Bundle将给予副本太(以及一个savedInstanceStateBundleonSaveInstanceState)。

对所有片段(包括没有参数的片段)执行此操作会导致片段的一致使用和易于维护。也就是说,确保始终通过参数Bundle,即使它是空的,以便您不必检查的null

2)onCreateFragment生命周期。

Fragment生命周期正式被称为“嵌套”,但是当添加新的片段时,我喜欢将其视为“正在追赶”。例如,如果您的活动已开始(已调用其onStart),则您的片段将快速连续执行onAttach,onCreate,onActivityCreated,0 onCreateView,onStart实质上可以追溯到活动的生命周期。您可以使用FragmentManager.enableDebugLogging(true);启用调试来跟踪生命周期更改 - 查找moveto(正向)和movefrom(倒回周期 - 销毁/分离碎片)。

也就是说,onCreate很容易预测 - 因为您可能首先在Activity的onCreate之后创建片段,所以在事务执行时几乎立即调用它。

然而,如果你进行配置更改,该片段被破坏的老活动,然后之前创建新的活动(它发生在super.onCreate(savedInstanceState)呼叫您在活动都) - 所有的碎片onCreate将在活动的onCreate返回之前调用。一旦它返回,碎片的onActivityCreated将被调用,从那时起碎片和活动将以锁步方式移动。这是所有,除非你有setRetainInstance(true),当然。

我希望这可以清除它。我强烈建议启用调试功能,只是为了让它们的生命周期获得更好的感觉而玩弄片段。

0

如果要将参数传递给片段,则需要新的实例方法。 您以这种方式传递参数,因为碎片可能处于分离状态,并且在重新添加它们时可能需要重新实例化。然后,Android将使用相同的参数再次调用newInstance方法,并且您的片段将正常工作。

如果您传递参数的onCreate方法(这是仅在首次创建片段的称呼),那么当一个片段重新实例,就不会得到这些参数。

+0

感谢您的回复 – user2580401