当前位置: 首页 > news >正文

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

我最近读到StackOverflow上面关于Fragment实例化的一个问题,觉得挺有趣的。

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

好问题。答案就是这篇文章的题目所建议的,这是一种合理的设计。在这种情况下,newInstance()方法是一种“静态工厂方法",让我们在初始化和设置一个新的fragment的时候省去调用它的构造函数和额外的setter方法。为你的Fragment提供静态工厂方法是一种好的做法,因为它封装和抽象了在客户端构造对象所需的步骤。例如,考虑下面的代码:

复制代码
 1 public class MyFragment extends Fragment {
 2 
 3     /**
 4      * 静态工厂方法需要一个int型的值来初始化fragment的参数,
 5      * 然后返回新的fragment到调用者 
 6      */
 7     public static MyFragment newInstance(int index) {
 8         MyFragment f = new MyFragment();
 9         Bundle args = new Bundle();
10         args.putInt("index", index);
11         f.setArguments(args);
12         return f;
13     }
14 }
复制代码

    不要让客户端去调用默认的构造函数,然后手动地设置fragment的参数。我们直接为它们提供一个静态工厂方法。这样做比调用默认构造方法好,有两个原因:一个是,它方便别人的调用。另一个是,保证了fragment的构建过程不会出错。通过提供一个静态工厂方法,我们避免了自己犯错--我们再也不用担心不小心忘记初始化fragmnet的参数或者没正确设置参数。
    总的来说,虽然两者的区别只在于设计,但是他们之间的差别非常大。因为提供静态工厂方法有向上抽象了一个级别,让代码更容易懂。

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

 

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


作者:kissazi2 
出处:http://www.cnblogs.com/kissazi2/ 
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/kissazi2/p/4127336.html

相关文章:

  • Android 2.3 r1 中文API (78)—— ViewAnimator
  • 构建之法阅读笔记06
  • 实现多点跳跃登录Xshell使用教程
  • [UML]UML系列——类图class的实现关系Realization
  • iOS不得姐项目--pop框架的初次使用
  • Mysql主主同步-配置数据同步
  • php字符串类型讲解
  • IOS照片颠倒分析及移动/页面端的处理策略和思路
  • 熊猫热土-环汶川50公里越野赛赛记
  • HDFS学习之FileSystem
  • DDD实践问题之 - 关于论坛的帖子回复统计信息的更新的思考
  • HDU1230 火星A+B【进制】
  • tomcat下server.xml配置详解
  • BZOJ 2599 Race(树分治)
  • BI报表帮你轻松自如完成数据分析、业务数据探查
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • Angular6错误 Service: No provider for Renderer2
  • CAP理论的例子讲解
  • E-HPC支持多队列管理和自动伸缩
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • js操作时间(持续更新)
  • Laravel Mix运行时关于es2015报错解决方案
  • OSS Web直传 (文件图片)
  • rabbitmq延迟消息示例
  • React 快速上手 - 07 前端路由 react-router
  • Shell编程
  • V4L2视频输入框架概述
  • webpack4 一点通
  • 基于HAProxy的高性能缓存服务器nuster
  • 目录与文件属性:编写ls
  • 由插件封装引出的一丢丢思考
  • # Maven错误Error executing Maven
  • # Panda3d 碰撞检测系统介绍
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #QT(串口助手-界面)
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • $.ajax中的eval及dataType
  • (8)STL算法之替换
  • (Git) gitignore基础使用
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (三)docker:Dockerfile构建容器运行jar包
  • (转)Mysql的优化设置
  • (转)Scala的“=”符号简介
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET 8.0 发布到 IIS
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .net framework4与其client profile版本的区别
  • .NET 事件模型教程(二)
  • .net和jar包windows服务部署
  • .net下的富文本编辑器FCKeditor的配置方法
  • .NET学习教程二——.net基础定义+VS常用设置
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • @PreAuthorize注解
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)