0

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

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 方法,什么时候会调用它?

4

2 回答 2

4

1) 为什么newInstance需要?

newInstance方法是必需的,因为框架鼓励您只有一个构造函数,不带参数。拥有多个构造函数有点令人不悦。

它需要这个构造函数是公开的,以便它可以重新创建片段,例如,当您进行配置更改时。Bundle您在原件上传递的相同内容setArguments也将提供给副本(以及savedInstanceState Bundlefrom onSaveInstanceState)。

对所有片段(包括没有参数的片段)执行此操作会导致片段使用一致并易于维护。也就是说,请确保始终传递一个 arguments Bundle,即使它是空的,这样你就不必getArguments()检查null.

2)onCreateFragment生命周期中。

生命Fragment周期正式称为“嵌套”,但在添加新片段时,我喜欢将其视为“追赶”。例如,如果您的 Activity 已启动(已onStart被调用),您的 Fragment 将获得快速连续的onAttach, onCreate, onActivityCreated, onCreateView,onStart本质上赶上 Activity 的生命周期。您可以启用调试FragmentManager.enableDebugLogging(true);以跟踪生命周期更改 - 查找moveto(正向)和movefrom(倒回循环 - 销毁/分离片段)。

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

但是,如果您进行配置更改,Fragment 将与旧 Activity 一起销毁,然后在新 Activity之前创建(它发生在super.onCreate(savedInstanceState)您的 Activity 中的调用中) -onCreate所有 Fragment 将在 ActivityonCreate返回之前调用。一旦它返回,FragmentsonActivityCreated将被调用,从那时起,Fragment 和 Activity 将同步移动。这就是全部,除非你有setRetainInstance(true),当然。

我希望这能解决问题。我强烈建议启用调试并只使用片段来更好地了解它们的生命周期。

于 2013-08-01T22:45:30.200 回答
0

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

如果您将参数传递给 onCreate 方法(仅在第一次创建片段时调用该方法),那么当重新实例化片段时,它不会获得这些参数。

于 2013-08-01T22:32:39.927 回答