android-fragments 在Android中,“new Fragment()”和“Fragment.getInstance()”之间有什么区别?

vsikbqxv  于 2022-11-14  发布在  Android
关注(0)|答案(2)|浏览(247)

在android编程中,
当我们将片段添加到特定布局时,
我们可以使用以下代码片段

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

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

我不明白片段对象定义语句之间有什么区别。从一些源代码中,当使用“Fragment.getInstance()”(如单例模式)时,使用“getInstance(Bundle data)”方法参数将包数据传递给片段。
你能告诉我有什么区别吗?

omtl5h9j

omtl5h9j1#

获取示例()for 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;
}

这样,您将只有一个地方创建参数包,而不是每次都要示例化片段。

o0lyfsai

o0lyfsai2#

首先要注意的是,如果系统破坏了你的片段,必须重新创建它,它将调用无参数的构造函数。这意味着你必须把参数保存在某个地方以备以后使用(你不能创建带参数的构造函数)。
现在,让我们回到你的问题。目前,这两个代码块几乎是相同的,但只是对于你提供的例子。如果你应该传递一些参数给你的片段,事情就有点不同了。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方法,但建议使用。

相关问题