"已经看到了两个通用实践来在应用程序中实例化一个新的片段:
Fragment newFragment = new MyFragment();
和
Fragment newFragment = MyFragment.newInstance();
第二个选项使用静态方法newInstance(),通常包含以下方法。
public static Fragment newInstance()
{
MyFragment myFragment = new MyFragment();
return myFragment;
}
起初,认为主要的好处是,可以重载newInstance()方法来创建一个Fragment的新实例时的灵活性 - 但是也可以通过为Fragment创建一个重载的构造函数来实现。
"
使用newInstance()我看到的唯一好处是以下几点:
您将拥有一个可以将片段使用的所有参数捆绑在一起的单独位置,而且每次实例化片段时都不必写下面的代码。
Bundle args = new Bundle();
args.putInt("someInt", someInt);
args.putString("someString", someString);
// Put any other arguments
myFragment.setArguments(args);
它是一个很好的方法来告诉其他类什么它期望忠实地工作(虽然你应该能够处理的情况下,如果没有参数在片段实例绑定)。
所以,我认为使用静态newInstance()来实例化一个片段是一个好习惯。
如果Android决定稍后重新创建Fragment,它将调用片段的无参数构造函数。所以重载构造函数不是一个解决方案。
就这么说,把东西传递给你的Fragment的方式,以便在Android重新创建片段之后它们是可用的,就是把一个包传递给setArguments方法。
所以,例如,如果我们想要传递一个整数给片段,我们可以使用如下的东西:
public static MyFragment newInstance(int someInt) {
MyFragment myFragment = new MyFragment();
Bundle args = new Bundle();
args.putInt("someInt", someInt);
myFragment.setArguments(args);
return myFragment;
}
在后面的片段中,onCreate()您可以使用以下命令访问该整数:
getArguments().getInt("someInt", 0);
即使片段被Android重新创建,这个Bundle也是可用的。
还要注意:setArguments只能在片段附加到活动之前调用。