我已经看到了两种在应用程序中实例化新 Fragment 的一般做法:
Fragment newFragment = new MyFragment();
和
Fragment newFragment = MyFragment.newInstance();
第二个选项使用静态方法newInstance(), 通常 包含以下方法。
newInstance()
public static Fragment newInstance() { MyFragment myFragment = new MyFragment(); return myFragment; }
起初,我认为主要的好处是我可以重载 newInstance() 方法以在创建 Fragment 的新实例时提供灵活性 - 但我也可以通过为 Fragment 创建重载构造函数来做到这一点。
我错过了什么?
一种方法比另一种方法有什么好处?或者这只是一个好习惯?
如果 Android 决定稍后重新创建您的 Fragment,它将调用您的 Fragment 的无参数构造函数。所以重载构造函数不是一个解决方案。
话虽如此,将东西传递给您的 Fragment 以便在 Android 重新创建 Fragment 后它们可用的方法是将包传递给该setArguments方法。
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()您可以使用以下方法访问该整数:
onCreate()
getArguments().getInt("someInt", 0);
即使 Android 以某种方式重新创建了 Fragment,此 Bundle 也将可用。
另请注意:setArguments只能在 Fragment 附加到 Activity 之前调用。
这种方法也记录在 android 开发者参考中:https ://developer.android.com/reference/android/app/Fragment.html