2016-12-15 193 views
0

在机器人编程,Android中的'new Fragment()'和'Fragment.getInstance()'有什么区别?

当我们片段添加到特定的布局,

我们可以使用folloing码

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

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

+0

[此链接可能会帮助你,请访问这里一次](http://stackoverflow.com/questions/9245408/best-practice-for-instantiating-a-new-android-fragment) – xbadal

+0

http:// www .androiddesignpatterns.com/2012/05/using-newinstance-to-instantiate.html此链接必须帮助您 – Athul

回答

1

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

4

片段实例化的getInstance()是一个熟悉的设计模式,它封装了片段及其参数的创建。这基本上意味着Fragment负责创建自己的实例,并且应该比仅调用新的Fragment()更清洁和更安全,因为您可以传递其他数据/捆绑包并“强制”用户使用此方法。请注意,您仍然在getInstance()方法中调用新的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; 
} 

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

相关问题