setArguments有什么意义?

时间:2012-07-09 14:27:49

标签: 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;
}

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

首先使用setArguments有什么意义?你能不能只使用二传手和吸气剂?

4 个答案:

答案 0 :(得分:38)

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

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

  

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

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

答案 1 :(得分:23)

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

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

必须通过Fragment.onSaveInstanceState()完成。保存的声明将作为savedInstanceState中的参数Fragment.onCreate()Fragment.onCreateView()以及其他几种方法传回给您。

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

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

答案 2 :(得分:6)

public void setArguments (Bundle args)
  

提供此片段的构造参数。这只能是   在片段附加到其活动之前调用;那是,   你应该在构造片段后立即调用它。的的   这里提供的参数将保留在片段destroy和   创作 (可能是官方遗漏的粗体文字   以前的文件)

Fragments.setArguments(Bundle args)

答案 3 :(得分:1)

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

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

如果传入一个bundle,就不可能滥用setter,你将始终知道这将在生命周期方法中设置。

相关问题