了解Fragment.newInstance方法

时间:2016-03-20 11:30:23

标签: java android fragment

我正在实施一个Android片段。我知道框架可以自动销毁并重新创建片段,并且重新创建片段会调用其默认构造函数,而不是具有参数的构造函数。 有很多帖子(例如this question的接受答案)显示了如何通过实现静态newInstance方法为片段提供参数。

我不明白的是谁叫newInstance。我的第一印象是 - 因为可以为这个newInstance方法定义任意参数 - 我应该在应用程序的某个地方添加一个显式调用,并且名称newInstance只是一个命名约定。但是,除了框架调用默认构造函数创建的第二个片段之外,我还要创建第二个片段,这让我很困惑。

上面的假设是不正确的,newInstance方法实际上是Java用于实例化类的内置方法的重载?在那种情况下,我看不出如何定义采用任意参数列表的newinstance方法。或者这可能在Java中,我只是不太了解Java?

2 个答案:

答案 0 :(得分:5)

您可以根据需要为该功能命名:newInstancegetInstancenewFragment。没关系,它只是一种辅助方法。重要的是,您将所有参数都放在fragment.setArguments(args)。 Android系统会记住这些参数,并在重新创建片段时使用它们。

public static MyFragment newInstance(int arg) {

    Bundle args = new Bundle();
    args.putInt("ARG", arg);

    MyFragment fragment = new MyFragment();
    fragment.setArguments(args);
    return fragment;
}

答案 1 :(得分:2)

newInstance是Android设计模式,因为Fragment不应该有任何其他Constructor beside the default Constructor

因此,您定义了一个Helper函数,以便将Arguments传递给Fragment

您不必使用它,但假设您有2 Activities两者都开始FragmentA

如果你不使用辅助函数你将需要复制代码来实例化片段。

  

我不明白的是谁调用newInstance

通常,您会在创建instantiate ... FragmentsActivity等的地方使用Adapter方法。

SectionPagerAdapter示例:

    @Override
    public Fragment getItem(int position) {
        // getItem is called to instantiate the fragment for the given page.
        // Return a PlaceholderFragment (defined as a static inner class below).
        return PlaceholderFragment.newInstance(position + 1);
    }

PlaceholderFragment.newInstance(int position)

的位置
public static PlaceholderFragment newInstance(int sectionNumber) {
        PlaceholderFragment fragment = new PlaceholderFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }
  

在这种情况下,我看不出如何定义采用任意参数列表的newinstance方法。

您可以传递任意参数列表,但您需要知道值Type,因为Bundle只有putX()个方法,其中X是参数的类型