【问题标题】:What is difference between 'new Fragment()' and 'Fragment.getInstance()' in Android?Android中的'new Fragment()'和'Fragment.getInstance()'有什么区别?
【发布时间】:2016-12-15 15:44:10
【问题描述】:

在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)' 方法参数将捆绑数据传递给片段。

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

【问题讨论】:

标签: android android-fragments


【解决方案1】:

getInstance() for Fragment 实例化是一种熟悉的设计模式,它封装了片段的创建及其参数。这基本上意味着 Fragment 负责创建自己的实例,并且应该比仅调用 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;
}

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

【讨论】:

    【解决方案2】:

    首先要注意的是,如果系统破坏了您的片段并且必须重新创建它,它将调用没有参数的构造函数。这意味着您必须将参数保存在某个地方以供以后使用(您不能使用 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 方法,但建议使用。

    【讨论】:

      猜你喜欢
      • 2018-08-02
      • 1970-01-01
      • 2018-06-04
      • 2011-11-22
      • 1970-01-01
      • 2012-05-23
      • 1970-01-01
      • 1970-01-01
      • 2017-10-31
      相关资源
      最近更新 更多