原文链接:Using newInstance() to Instantiate a Fragment

new MyFragment()和MyFragment.newInstance()之间的差别是什么?应该用哪个呢?

newInstance()方法是一种“静态工厂方法”,让我们在初始化和设置一个新的fragment的时候省去调用它的构造函数和额外的setter方法。为你的Fragment提供静态工厂方法是一种好的做法,因为它封装和抽象了在客户端构造对象所需的步骤。例如,考虑下面的代码:

public class MyFragment extends Fragment {    /** * 静态工厂方法需要一个int型的值来初始化fragment的参数, * 然后返回新的fragment到调用者 */    public static MyFragment newInstance(int index) {        MyFragment f = new MyFragment();        Bundle args = new Bundle();        args.putInt("index", index);        f.setArguments(args);        return f;    }}

不要让客户端去调用默认的构造函数,然后手动地设置fragment的参数。我们直接为它们提供一个静态工厂方法。这样做比调用默认构造方法好,有两个原因:一个是,它方便别人的调用。另一个是,保证了fragment的构建过程不会出错。通过提供一个静态工厂方法,我们避免了自己犯错–我们再也不用担心不小心忘记初始化fragmnet的参数或者没正确设置参数。

总的来说,虽然两者的区别只在于设计,但是他们之间的差别非常大。因为提供静态工厂方法有向上抽象了一个级别,让代码更容易懂。

译者注:其实提供静态工厂而不是使用默认构造函数或者自己定义一个有参的构造函数还有至关重要一点。fragmnet经常会被销毁重新实例化,Android framework只会调用fragment无参的构造函数。在系统自动实例化fragment的过程中,你没有办法干预。一些需要外部传入的参数来决定的初始化就没有办法完成。使用静态工厂方法,将外部传入的参数可以通过Fragment.setArgument保存在它自己身上,这样我们可以在Fragment.onCreate(…)调用的时候将这些参数取出来。

简单总结:

使用Fragment.setArguments(Bundle bundle)这种方式来传递参数,而不要通过构造方法直接来传递参数。

原因:
我们可以知道Activity重新创建时,会重新构建它所管理的Fragment,原先的Fragment的字段值将会全部丢失,但是通过Fragment.setArguments(Bundle bundle)方法设置的bundle会保留下来。所以尽量使用Fragment.setArguments(Bundle bundle)方式来传递参数。

参考:http://www.cnblogs.com/kissazi2/p/4127336.html

更多相关文章

  1. (Android、Java) AES加密方法
  2. Android(安卓)Studio用法之ListView(图文并茂的listview界面)
  3. 【Android(安卓)开发教程】保存到外部存储设备(SD卡)
  4. android 4.4 沉浸式状态栏实现
  5. [Android]获取设备IP地址
  6. Android之Volley框架加载网络图片的三种方式
  7. 14天学会安卓开发(第十天)Android网络与通讯
  8. Android(安卓)2.2 r1 API中文文档—— Toast
  9. Android(安卓)Studio配置AspectJ(使用jar包的方法)

随机推荐

  1. android 开发零起步学习笔记(二十五):Androi
  2. Android(Lollipop/5.0) Material Design(
  3. Android学习第一章第一节android学习路线
  4. ANDROID 控件常用属性
  5. Android隐藏状态栏和标题栏,相当于全屏效
  6. android:hintText与android:inputType详
  7. Android(安卓)WebView与Js的交互
  8. Android(Lollipop/5.0) Material Design(
  9. .Net 转战 Android(安卓)4.4 日常笔记目
  10. Android系统自带样式(@android:style/)