您好我在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
有什么意义?你能不能只使用二传手和吸气剂?
答案 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和 创作 (可能是官方遗漏的粗体文字 以前的文件)
答案 3 :(得分:1)
此外,设置者可能被滥用。如果updateSomeOtherStuff()将更改某些视图,则会崩溃。
public class MyFragment extends Fragment {
void setData(someData){
this.someData = someData;
updateSomeOtherStuff()
}
}
如果传入一个bundle,就不可能滥用setter,你将始终知道这将在生命周期方法中设置。