嗨,我在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
。绕过整个CCD_ 4。
首先使用setArguments
有什么意义?你能不能只用setter和getter?
您可以使用getter和setter,但通过传递捆绑包,您不需要编写代码,因为它已经存在了。此外,我相信,如果屏幕方向发生变化,这些论点会自动再次传递,这也会让生活变得更轻松。
从本质上讲,setArguments和getArguments只是谷歌建议您遵循的一种设计模式:
每个片段都必须有一个空的构造函数,因此它可以在恢复其活动的状态时实例化。它很强建议子类不具有其他构造函数参数,因为当片段被重新实例化;相反,参数可以由具有setArguments(Bundle)的调用者,稍后由Fragment检索使用getArguments()。http://developer.android.com/reference/android/app/Fragment.html
我认为这包括你的碎片操作所需的设置器。再说一遍,没有什么强迫你这样做,正如你所知,这并不是让事情发挥作用的唯一方法。
补充Matthew的回答:他正确地引用了Fragments需要有一个空的构造函数,这样框架就可以在需要时重新实例化它们。
使用getter和setter是可以的,但由于框架可能会破坏和重新创建Fragment,因此必须确保不会丢失这些参数。
这必须通过Fragment.onSaveInstanceState()
完成。保存的声明将作为参数savedInstanceState
在Fragment.onCreate()
、Fragment.onCreateView()
和其他几种方法中返回给您。
使用Fragment.setArguments()
(在大多数情况下,我认为)更容易,在框架中会自动保留参数,从而为您完成大部分工作。
Setters可能是您最初提供给片段的参数的方法,片段可能会随着时间的推移自行调整。在这种情况下,单独处理savedInstanceState可能比处理savedInstanceState和参数更容易,在这些参数中,您必须决定哪个是有效参数。
public void setArguments (Bundle args)
提供此片段的构造参数。这只能是在片段附着到其活性之前调用;即,您应该在构建片段后立即调用它此处提供的参数将在片段销毁和创建(可能是官方缺少粗体文本以前的文档)
Fragments.setArguments(Bundle args)
此外,setter也可能被滥用。如果updateSomeOtherStuff()将更改某些视图,则会崩溃。
public class MyFragment extends Fragment {
void setData(someData){
this.someData = someData;
updateSomeOtherStuff()
}
}
如果传入一个bundle,就不可能滥用setter,并且您将始终知道这将在生命周期方法中设置。