Using newInstance() to Instantiate a Fragment(转)

I recently came across an interesting question on StackOverflow regarding Fragment instantiation:

What is the difference between new MyFragment() and MyFragment.newInstance()? Should I prefer one over the other?

Good question. The answer, as the title of this blog suggests, is a matter of proper design. In this case, the newInstance()method is a "static factory method," allowing us to initialize and setup a new Fragment without having to call its constructor and additional setter methods. Providing static factory methods for your fragments is good practice because it encapsulates and abstracts the steps required to setup the object from the client. For example, consider the following code:

public class MyFragment extends Fragment {

    /**
     * Static factory method that takes an int parameter,
     * initializes the fragment‘s arguments, and returns the
     * new fragment to the client.
     */
    public static MyFragment newInstance(int index) {
        MyFragment f = new MyFragment();
        Bundle args = new Bundle();
        args.putInt("index", index);
        f.setArguments(args);
        return f;
    }

}

Rather than having the client call the default constructor and manually set the fragment‘s arguments themselves, we provide a static factory method that does this for them. This is preferred over the default constructor for two reasons. One, it‘s convenient for the client, and two, it enforces well-defined behavior. By providing a static factory method, we protect ourselves from bugs down the line—we no longer need to worry about accidentally forgetting to initialize the fragment‘s arguments or incorrectly doing so.

Overall, while the difference between the two is mostly just a matter of design, this difference is really important because it provides another level of abstraction and makes code a lot easier to understand.

Feel free to leave a comment if this blog post helped (it will motivate me to write more in the future)! :)

http://www.androiddesignpatterns.com/2012/05/using-newinstance-to-instantiate.html

http://www.cnblogs.com/kissazi2/p/4127336.html(有译文)

时间: 2024-10-25 23:59:36

Using newInstance() to Instantiate a Fragment(转)的相关文章

【译】使用newInstance()来实例化fragment

我最近读到StackOverflow上面关于Fragment实例化的一个问题,觉得挺有趣的. new MyFragment()和MyFragment.newInstance()之间的差别是什么?应该用哪个呢? 好问题.答案就是这篇文章的题目所建议的,这是一种合理的设计.在这种情况下,newInstance()方法是一种“静态工厂方法",让我们在初始化和设置一个新的fragment的时候省去调用它的构造函数和额外的setter方法.为你的Fragment提供静态工厂方法是一种好的做法,因为它封装和

Unable to instantiate fragment com.viewpager.demo.FirstFragment: make sure class name exists, is pub

尊重原创:http://blog.csdn.net/yuanzeyao/article/details/40922875 最近在项目中经常遇到旋转屏幕或者home键退至后台,然后恢复前台导致应用崩溃,崩溃log如标题所示,从log的信息来看,导致崩溃的原因是该Fragment没有提供一个默认构造函数(无参构造函数),经过深入分析发现,Activity中有Fragment,并且Fragment没有无参构造函数,那么这个崩溃非常容易出现,因为在旋转屏幕的过程中,Activity是会被销毁重建的,这个

Android解惑 - 为什么要用Fragment.setArguments(Bundle bundle)来传递参数(转)

Fragment在Android3.0开始提供,并且在兼容包中也提供了Fragment特性的支持.Fragment的推出让我们编写和管理用户界面更快捷更方便了. 但当我们实例化自定义Fragment时,为什么官方推荐Fragment.setArguments(Bundle bundle)这种方式来传递参数,而不推荐通过构造方法直接来传递参数呢?为了弄清这个问题,我们可以做一个测试,分别测试下这两种方式的不同 首先,我们来测试下通过构造方法传递参数的情况 public class FramentT

TabLayout+ViewPager+Fragment制作页卡

本人很懒,直接上代码了. 布局文件: <?xml version="1.0" encoding="utf-8"?><android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-

简述fragment(上)

Fragment是在Android 3.0 以后引入的,如果你想在3.0以前使用那就只能引入v4包了,它很好的解决了Android的碎片问题,尤其是在平板上更能显示出Fragment的优势. Fragment既然这么好,如何加载呢?一种方法可以直接使用fragment布局,静态加载,另一种动态加载,在我们的应用中很少用到Fragment的静态加载方法,所以我们这里只讨论Fragment的动态加载. 1.Fragment是什么? Fragment是一个控件,是一个window,是视图的一部分?让源

浅析Fragment为什么需要Public的empty constructor

最近,在做一个项目.当app启动后,然后使其进入后台进程(按home键),接着使用其它app(用其它app的目的是为了让系统内存不足,然后让系统将我们的app杀死).当我们的app被系统杀死后,这时候通过任务管理点击我们的app进入应用.这时候问题出现了,app崩溃了,为了不暴露项目,一些项目包名或者类名的信息就省略了,下面就是异常的关键信息: java.lang.RuntimeException: Unable to start activity ComponentInfo{省略}: andr

Android开发之Fragment传递参数的几种方法

Fragment在Android3.0开始提供,并且在兼容包中也提供了Fragment特性的支持.Fragment的推出让我们编写和管理用户界面更快捷更方便了. 但当我们实例化自定义Fragment时,为什么官方推荐Fragment.setArguments(Bundle bundle)这种方式来传递参数,而不推荐通过构造方法直接来传递参数呢?为了弄清这个问题,我们可以做一个测试,分别测试下这两种方式的不同 首先,我们来测试下通过构造方法传递参数的情况 public class FramentT

如何使用viewpager与fragment写一个app导航activity

今天我们来看一下如何使用viewpager和fragment组合来写一个app导航activity,这里使用到了android开源控件viewpagerindicator,有兴趣的同学可以去它网站上看看它的介绍. 附上效果截图一张: demo中只有一个activity,是用activity_main.xml来布局,其内容如下: <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:and

Android Fragment小结

为何使用Fragment? 实现UI的灵活组建与拆分,与Activity配合可保持Activity的视图不变,转而操作Fragment,就像Activity的模块与组建一样.同时解决了 在平板上UI的适应性. <Android编程权威指南>一书作者提出了AUF(即Always Use Fragment)原则----暂且相信他 Fragment 的生命周期依赖于Activity的生命周期,并且有自己独特的方法,不多赘述. 1.获取Fragment的视图(layout转成视图对象) 通过重写fra