了解Fragment.newInstance方法

Dab*_*ler 4 java android fragment

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

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

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

Ark*_*ior 5

只要你喜欢,你可以命名函数:newInstance,getInstance,newFragment.没关系,它只是一种辅助方法.重要的是你把所有的论据都放在了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;
}
Run Code Online (Sandbox Code Playgroud)


roy*_*oyB 5

newInstance是一种 Android 设计模式,因为除了默认之外Fragment不应有任何其他设计模式ConstructorConstructor

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

您不必使用它,但假设您有 2 个Activities同时启动FragmentA

如果您不使用辅助函数,您将需要复制代码来实例化 Fragment。

我不明白是谁在调用 newInstance

通常你会使用的instantiate方法从创建的地方Fragments...... ActivityAdapter和这样的。

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);
    }
Run Code Online (Sandbox Code Playgroud)

哪里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;
    }
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我不知道如何定义一个接受任意参数列表的新实例方法。

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