实例化新的Android Fragment的最佳做法

我已经看到了两种在应用程序中实例化新片段的一般做法:

Fragment newFragment = new MyFragment();

Fragment newFragment = MyFragment.newInstance();

第二个选项使用静态方法newInstance()并且通常包含以下方法。

public static Fragment newInstance() 
{
    MyFragment myFragment = new MyFragment();
    return myFragment;
}

起初,我认为主要的好处是我可以重载newInstance()方法来创建Fragment的新实例时提供灵活性 - 但我也可以通过为Fragment创建一个重载构造函数来实现此目的。

我错过了什么?

一种方法比另一种方法有什么好处? 或者这只是一个好习惯?


如果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;
}

稍后在Fragment onCreate()您可以使用以下命令访问该整数:

getArguments().getInt("someInt", 0);

即使片段由Android重新创建,该Bundle也可用。

另请注意: setArguments只能在Fragment附加到Activity之前调用。

这种方法也记录在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)
    
    链接地址: http://www.djcxy.com/p/58697.html

    上一篇: Best practice for instantiating a new Android Fragment

    下一篇: How to determine fragment restored from backstack