协慌网

登录 贡献 社区

实例化新的 Android 片段的最佳做法

我已经看到了两种在应用程序中实例化新 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()的唯一好处是:

  1. 您将有一个地方可以捆绑该片段使用的所有参数,并且不必在每次实例化一个片段时都在下面编写代码。

    Bundle args = new Bundle();
    args.putInt("someInt", someInt);
    args.putString("someString", someString);
    // Put any other arguments
    myFragment.setArguments(args);
  2. 这是一种告诉其他类它希望忠实工作的参数的好方法(尽管如果片段实例中没有捆绑任何参数,则您应该能够处理各种情况)。

因此,我的看法是,使用静态newInstance()实例化一个片段是一种好习惯。

还有另一种方法:

Fragment.instantiate(context, MyFragment.class.getName(), myBundle)