43

嗨,我正在查看 android 网站上的以下 Fragments 示例。

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

您是否也不能简单地实例化DetailsFragment并使用 setter 方法来设置index。绕过整体setArguments

首先使用setArguments有什么意义?你不能只使用 setter 和 getter 吗?

4

4 回答 4

40

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

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

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

我认为这包括您的 Fragment 运行所需的设置器。话又说回来 - 没有什么强迫你这样做,而且如你所知 - 这不是让事情发挥作用的唯一方式。

于 2012-07-09T14:33:45.170 回答
25

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

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

这必须通过Fragment.onSaveInstanceState(). 保存的声明将作为 中的参数和其他几种方法传回savedInstanceStateFragment.onCreate()Fragment.onCreateView()

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

设置器可能是您最初提供给片段的参数的方式,片段可能会随着时间的推移自行调整。在这种情况下,单独处理 savedInstanceState 可能比处理 savedInstanceState 和参数更容易 - 你必须决定哪个是有效参数。

于 2013-02-18T06:51:53.217 回答
6
public void setArguments (Bundle args)

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

Fragments.setArguments(捆绑参数)

于 2015-01-21T07:46:58.103 回答
1

此外,setter 可能会被滥用。如果 updateSomeOtherStuff() 将更改某些视图,则会崩溃。

public class MyFragment extends Fragment {
   void setData(someData){
       this.someData = someData;
       updateSomeOtherStuff()
   }
}

如果传入一个包,则不可能滥用设置器,并且您将始终知道这将在生命周期方法中设置。

于 2016-12-06T09:46:12.703 回答