我已经看到了两种在应用程序中实例化新 Fragment 的常规方法:
Fragment newFragment = new MyFragment();
和
Fragment newFragment = MyFragment.newInstance();
第二个选项使用静态方法newInstance()
并且通常包含以下方法。
public static Fragment newInstance()
{
MyFragment myFragment = new MyFragment();
return myFragment;
}
最初,我认为主要的好处是可以在创建 Fragment 的新实例时重载 newInstance()方法以提供灵活性 - 但我也可以通过为 Fragment 创建重载的构造函数来做到这一点。
我错过了什么?
一种方法比另一种方法有什么好处?还是只是好的做法?
如果 Android 决定稍后再创建您的片段,它将调用片段的无参数构造函数。因此,重载构造函数不是解决方案。
话虽这么说,将内容传递给 Fragment 以便在 Android 重新创建 Fragment 之后可用的方式是将 bundle 传递给setArguments
方法。
因此,例如,如果我们想将整数传递给片段,我们将使用类似以下内容:
public static MyFragment newInstance(int someInt) {
MyFragment myFragment = new MyFragment();
Bundle args = new Bundle();
args.putInt("someInt", someInt);
myFragment.setArguments(args);
return myFragment;
}
然后,在 Fragment onCreate()
您可以使用以下方式访问该整数:
getArguments().getInt("someInt", 0);
即使 Fragment 是由 Android 重新创建的,此 Bundle 仍然可用。
另请注意:只能在将 Fragment 附加到 Activity 之前调用setArguments
android 开发人员参考中也记录了这种方法: https://developer.android.com/reference/android/app/Fragment.html
我看到的newInstance()
的唯一好处是:
您将有一个地方可以捆绑该片段使用的所有参数,并且不必在每次实例化一个片段时都在下面编写代码。
Bundle args = new Bundle();
args.putInt("someInt", someInt);
args.putString("someString", someString);
// Put any other arguments
myFragment.setArguments(args);
这是一种告诉其他类它希望忠实工作的参数的好方法(尽管如果片段实例中没有捆绑任何参数,则您应该能够处理各种情况)。
因此,我的看法是,使用静态newInstance()
实例化一个片段是一种好习惯。
还有另一种方法:
Fragment.instantiate(context, MyFragment.class.getName(), myBundle)