使用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/

相关文章推荐

使用newInstance()来实例化fragment

这种设计是一种静态工厂方法,让我们在初始化和设置一个新的fragment的时候省去调用它的构造函数和额外的setter方法。为你的Fragment提供静态工厂方法是一种好的做法,因为它封装和抽象了在客...

Android使用newInstance()实例化fragment&setArguments()传递参数

原文链接:Using newInstance() to Instantiate a Fragment new MyFragment()和MyFragment.newInstance()之间的差别是...

Android 从源码的角度分析——为什么要用newInstance来实例化Fragment

最近在看Google技术文档的时候发现了一种新的方式来实例化Fragment,就是采用静态工厂的方式创建Fragment。我们在使用Android studio创建一个类的时候,选择New ->Fra...

Android中利用newInstance()方法实例化fragment

Android是在Android 3.0 (API level 11)开始引入Fragment的。Fragment可以使你能够将activity分离成多个可重用的组件,每个都有它自己的生命周期和UI。...

Fragment点击按钮替换界面防止重新实例化,使用hide和add

1、我也是在网上找别人的参考。项目中写完,写在博客里也算是重新温习了一下。当然也算是做个笔记。 /** 当前的fragment */ //当前的frament是在界面一显示就出现...

让fragment只实例化一次

  • 2016-05-14 10:38
  • 714B
  • 下载

让多个Fragment 切换时不重新实例化

在项目中需要进行Fragment的切换,一直都是用replace()方法来替换Fragment: 123456789 public void switchContent...

让多个Fragment 切换时不重新实例化

转载链接:https://yrom.net/blog/2013/03/10/fragment-switch-not-restart/ 在项目中需要进行Fragment的切换,一直都是用r...

解决Fragment切换时实例化加载数据问题

在做项目的时候,遇到fragment切换时,每次都重新在网络上加载数据。在网上查了很多相关资料,现总结一下解决办法。 布局文件和QQ主界面类似,布局对应的java类命名为:HomeActivity。!...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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