使用newInstance()来实例化fragment

转载 2017年01月03日 11:38:08

我最近读到StackOverflow上面关于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(...)调用的时候将这些参数取出来。

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


转自:http://www.cnblogs.com/kissazi2/

正确使用Fragment之创建/传参——newInstance方法(native)

使用频率如此之高的Fragment,你的使用姿势,真的正确吗? 如果你还在new Fragment(), 不妨来看看谷歌默认推荐的Fragment.newInstance()吧...
  • lebang08
  • lebang08
  • 2017年02月18日 17:41
  • 2369

使用newInstance()来实例化fragment 并传递数据

好问题。答案就是这篇文章的题目所建议的,这是一种合理的设计。在这种情况下,newInstance()方法是一种“静态工厂方法",让我们在初始化和设置一个新的fragment的时候省去调用它的构造函数和...
  • tiramisu_ljh
  • tiramisu_ljh
  • 2017年04月09日 13:54
  • 185

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

我最近读到StackOverflow上面关于Fragment实例化的一个问题,觉得挺有趣的。 new MyFragment()和MyFragment.newInstance()之间的差别是什么?...
  • u012296101
  • u012296101
  • 2015年03月10日 16:36
  • 629

创建Fragment使用 构造函数 还是 newInstance()

Creating a Fragment: constructor vs newInstance() from stack overflow and another chapter 最近,我厌倦了在...
  • Working_Harder
  • Working_Harder
  • 2015年11月23日 15:55
  • 2480

JAVA的newInstance()和new的区别(JAVA反射机制,通过类名来获取该类的实例化对象)

1.在初始化一个类,生成一个实例的时候;newInstance() 和 new 有什么区别?      用newInstance与用new是区别的,区别在于创建对象的方式不一样,前者是使用类加载机制,...
  • guoxiaolongonly
  • guoxiaolongonly
  • 2016年04月29日 10:10
  • 11037

基于Fragment的轻量级Android插件化框架

本文写了一个简单的插件化框架学习的Demo,下载地址https://github.com/pengyuntao/yuntao-plugin 本插件使用fragment来构建页面,没有实现service...
  • industriously
  • industriously
  • 2016年09月01日 18:49
  • 2260

关于切换Fragment的不重新实例化的解决方法

我一般用的replace()方法去切换Fragment,当你只写静态页面的时候是看不出什么区别的,可当你和服务器交互时你就会发现,即便是已经显示过的Fragment还是会被重新实例化,因为replac...
  • u012504392
  • u012504392
  • 2016年11月02日 09:15
  • 1525

fragment学两个demo就会用(二)

(转载加编辑)fragment与activity之间通信原理以及例子 首先,如果你想在android3.0及以下版本使用fragment,你必须引用android-support-v4.ja...
  • djun100
  • djun100
  • 2013年08月19日 13:38
  • 16123

Java使用new和反射实例化内部类对象

java使用new和反射实例化内部类对象 前两天看到一道面试题,是关于内部类的知识,觉得很有意思,现对其详细讲解,绝对原创!~ 这道题是这样的: 根据注释填写(1),(2),(3)处的代码 publi...
  • changlei_shennan
  • changlei_shennan
  • 2017年03月07日 16:09
  • 416

Fragment简介和使用实例

转载请注明出处:http://blog.csdn.net/yegongheng/article/details/22811157 Fragment 是什么        今天我们来学习一个...
  • yegongheng
  • yegongheng
  • 2014年07月21日 11:15
  • 1998
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用newInstance()来实例化fragment
举报原因:
原因补充:

(最多只允许输入30个字)