';新片段()';和';Fragment.getInstance()';在Android中?

';新片段()';和';Fragment.getInstance()';在Android中?,android,android-fragments,Android,Android Fragments,在android编程中 当我们将片段添加到特定布局时 我们可以使用以下代码 Fragment fragment = new SampleFragment(); FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(R

在android编程中

当我们将片段添加到特定布局时

我们可以使用以下代码

Fragment fragment = new SampleFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.content_layout, fragment);
fragmentTransaction.commit();

我不明白那个句话的不同之处是什么。 从某些源代码中,当使用类似于singleton模式的“Fragment.getInstance()”时,使用“getInstance(bundle data)”方法参数将bundle数据传递给Fragment

你能告诉我有什么区别吗?

片段实例化的getInstance()是一种熟悉的设计模式,它封装了片段的创建及其参数。这基本上意味着片段负责创建自己的实例,并且应该比只调用new Fragment()更干净、更安全,因为您可以传递额外的数据/包并“强制”用户使用此方法。请注意,您仍然在getInstance()方法中调用new Fragment(),它不会替换它

public static SomeFragment newInstance(int a, boolean b) {
SomeFragment someFragment = new SomeFragment();

Bundle args = new Bundle();
args.putInt("a", a);
args.putBoolean("b",b);
.....
someFragment.setArguments(args);

return someFragment;
}

这样,您将只有一个地方可以创建参数束,而不是每次您想要实例化片段时都可以创建参数束。

首先要注意的是,如果系统破坏了您的片段并必须重新创建它,它将调用构造函数,而不使用任何参数。这意味着您必须将参数保存到某个地方,以便以后使用(不能使用args创建构造函数)

现在,让我们回到你的问题上来。目前,这两个代码块几乎相同,但仅适用于您提供的示例。如果您应该将一些参数传递给您的片段,事情就有点不同了。
getInstance
应该将所需的参数添加到片段中,以保证它们在将来可用

就我个人而言,我使用
getInstance/newInstance
(您可能会发现它的变体,现在,在Android Studio中创建一个模板片段,使用
newInstance
)方法在该片段中传递我需要的参数。例如,如果在该片段中需要两个字符串,我将把它们传递给
getInstance
方法 并将它们保存在片段参数中,以确保在重新创建片段时它们可用

public static MyFragment getInstance(String param1, String param2) {
    MyFragment fragment = new MyFragment();
    Bundle args = new Bundle();
    args.putString(KEY_ONE, param1);
    args.putString(KET_TWO, param2);
    fragment.setArguments(args);
    return fragment;
}
当然,对于这个方法,您可以传递一个
Bundle
,但是我认为这样更清楚一点,指定片段将使用的每个参数

也就是说,如果要创建与上述块等效的块,则应使用以下内容:

MyFragment fragment = new MyFragment();
Bundle args = new Bundle();
// set your arguments here
fragment.setArguments(args);
// and from here use your code as you did
总之,使用
getInstance
可以停止代码重复(注意,如果应该创建片段10次,那么应该复制上面的代码10次),如果正确创建片段(第二个代码块),那么实际上不必使用
getInstance
方法,但建议这样做

这个链接必须帮助你
MyFragment fragment = new MyFragment();
Bundle args = new Bundle();
// set your arguments here
fragment.setArguments(args);
// and from here use your code as you did