为什么在公共静态类中实例化一个新片段

时间:2014-10-08 18:07:26

标签: java android android-fragments

参考:Fragment Documentation

我是Java和Android的新手,并通过在线android指南。我有两个问题:

问题1:为什么需要在 公共静态类?

问题2:"创建新实例"进一步声明一个新的DetailsFragment。总体 有四个地方名字相同" DetailsFragment"用来。这非常令人困惑。 请解释一下?


public static class DetailsFragment extends Fragment {

    /* Create a new instance of DetailsFragment, initialized
       to show the text at 'index'. */

    public static DetailsFragment newInstance(int index) {
        DetailsFragment f = new DetailsFragment();

        // Supply index input as an argument.
        Bundle args = new Bundle();
        args.putInt("index", index);
        f.setArguments(args);

        return f;
    }
}

2 个答案:

答案 0 :(得分:3)

这称为static factory method pattern,在这种情况下,您可以轻松创建一个新的片段实例,并填充所有必需的参数,而无需了解内部实现。例如,如果没有这个,要创建一个正确初始化的Fragment实例,你可以使用:

DetailsFragment fragment = new DetailsFragment();
Bundle args = new Bundle();
args.putInt("index", index);
fragment.setArguments(args);
// Then use the fragment however you need it

使用静态工厂方法,所有逻辑都内化到Fragment本身,您只需使用:

DetailsFragment fragment = DetailsFragment.newInstance(index);
// Then use the fragment

答案 1 :(得分:1)

Fragments的最佳实践是使用静态newInstance()方法,因为在许多情况下Android系统需要(并将使用)一个空的公共构造函数来创建Fragment。

例如,如果您显示DetailsFragment并且用户然后锁定他们的设备并在半小时后回来,Android将尝试重新创建应用程序的状态,以及何时需要重新实例化DetailsFragment,它将使用一个空的公共构造函数。

然而,片段使用setArguments(Bundle)支持参数。因此,您可以使用静态newInstance()方法代替构造函数来设置重新创建片段所需的参数。

在此DetailsFragment的示例中,当Android重新创建片段时,index变量仍可通过调用getArguments().getInt("index")对片段可用。如果您在构造函数中创建了index变量,则在重新创建片段时该信息将会丢失。