setArguments有什么意义?

HGP*_*GPB 41 android android-fragments

嗨,我在Android网站上看下面的片段示例.

http://developer.android.com/guide/components/fragments.html#Example

我想知道为什么要执行某些方法.

例如,为什么detailsFragment执行以下方法:

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;
}
Run Code Online (Sandbox Code Playgroud)

您是否也可以简单地实例化DetailsFragment并使用setter方法来设置index.绕过整个setArguments.

setArguments首先使用的重点是什么?你能不能只使用二传手和吸气剂?

Mat*_*uno 38

您可以使用getter和setter,但是通过传入一个bundle,您不需要编写该代码,因为它已经存在.此外,我相信如果屏幕方向改变,这些参数会自动再次传入,这也使生活更轻松.

从本质上讲,setArguments和getArguments只是Google建议您遵循的设计模式:

每个片段都必须有一个空构造函数,因此可以在恢复其活动状态时进行实例化.强烈建议子类没有带参数的其他构造函数,因为在重新实例化片段时不会调用这些构造函数.相反,参数可以由调用者使用setArguments(Bundle)提供,稍后由Fragment使用getArguments()检索. http://developer.android.com/reference/android/app/Fragment.html

我认为这包括你的Fragment运行所需的setter.然后再说 - 没有什么可以强迫你这样做,而且正如你所知道的那样 - 这不是让事情成功的唯一方法.


sst*_*stn 24

只是为了补充Matthew的答案:他正确引用了Fragments需要一个空的构造函数,以便框架可以在需要时重新实例化它们.

使用getter和setter是好的,但是由于框架可能会破坏并重新创建Fragment,因此必须确保不丢失这些参数.

这必须通过Fragment.onSaveInstanceState().保存的规定将被传递给您的参数savedInstanceStateFragment.onCreate(),Fragment.onCreateView()和其他一些方法.

使用Fragment.setArguments()is(在大多数情况下,我假设)更容易,在框架将自动保留参数,从而将为您完成大部分工作.

Setter可能是您最初提供给Fragment的参数以及片段可能随时间调整的方式.在这种情况下,单独处理savedInstanceState可能比处理savedInstanceState和arguments更容易 - 你必须做出决定哪个是有效参数.

  • 这是理解碎片的一个至关重要的方面,我认为碎片可能会被遗忘.您的回复提供了一些见解.如果你不想使用setArguments,而是想使用setter,那么你必须使用onSaveInstanceState或android将无法重新初始化你的Fragment?哎呀! (4认同)
  • @rmirabelle Underdocumentation似乎是我在Android中的很多案例的情况,不幸的是.我发现了许多不可能或有问题的案例,这些案例要么根本没有记录,要么只作为某个地方的边节点或者stackoverflow/google小组回答某个地方. (3认同)

AKh*_*AKh 6

public void setArguments (Bundle args)
Run Code Online (Sandbox Code Playgroud)

提供此片段的构造参数.这只能在片段附加到其活动之前调用; 也就是说,你应该在构造片段后立即调用它.这里提供的参数将在片段销毁和创建中保留 (可能是以前的官方文档中缺少粗体的文本)

Fragments.setArguments(Bundle args)