虽然@yydl提供了关于newInstance
方法更好的原因:
如果Android决定稍后重新创建您的Fragment,则会调用您的fragment的无参构造函数。因此,重载构造函数并不是一个解决方案。
但仍然可以使用构造函数。为了理解这一点,首先需要了解Android使用上述解决方法的原因。
在使用片段之前,需要一个实例。Android调用YourFragment()
(即无参数构造函数)来构造片段的实例。在这里,您编写的任何重载构造函数都将被忽略,因为Android无法知道要使用哪个构造函数。
在Activity的生命周期中,Android多次创建并销毁片段。这意味着,如果将数据放入片段对象本身中,则一旦销毁片段,该数据将丢失。
为了解决这个问题,Android要求您使用Bundle
存储数据(调用setArguments()
),然后可以从YourFragment
访问该数据。参数bundle
由Android保护,因此保证是持久的。
设置此bundle的一种方法是使用静态的newInstance
方法:
public static YourFragment newInstance (int data) {
YourFragment yf = new YourFragment()
Bundle args = new Bundle();
args.putInt("data", data);
yf.setArguments(args);
return yf;
}
然而,构造函数:
public YourFragment(int data) {
Bundle args = new Bundle();
args.putInt("data", data);
setArguments(args);
}
可以完全像newInstance
方法一样执行。
当然,这会失败,并且这是Android希望您使用newInstance
方法的原因之一:
public YourFragment(int data) {
this.data = data;
}
作为进一步的解释,这里是Android中的Fragment类:
public void setArguments(Bundle args) {
if (mIndex >= 0) {
throw new IllegalStateException("Fragment already active");
}
mArguments = args;
}
请注意,Android要求参数仅在构造函数中设置,并保证这些参数将被保留。
编辑:正如@JHH在评论中指出的那样,如果您提供了一个需要一些参数的自定义构造函数,则Java不会为您的片段提供无参默认构造函数。因此,这将要求您定义一个无参构造函数,这是您可以通过使用“newInstance”工厂方法避免的代码。
编辑:Android不再允许对片段使用重载构造函数。您必须使用“newInstance”方法。