Android使用newInstance()实例化fragment&setArguments()传递参数
2016-06-12 10:29
363 查看
原文链接:Using newInstance() to Instantiate a Fragment
new MyFragment()和MyFragment.newInstance()之间的差别是什么?应该用哪个呢?
newInstance()方法是一种“静态工厂方法”,让我们在初始化和设置一个新的fragment的时候省去调用它的构造函数和额外的setter方法。为你的Fragment提供静态工厂方法是一种好的做法,因为它封装和抽象了在客户端构造对象所需的步骤。例如,考虑下面的代码:
不要让客户端去调用默认的构造函数,然后手动地设置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
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
相关文章推荐
- Android学习笔记一之Android基础
- Android Manifest 权限描述大全
- 获取androidmanifest中的渠道号
- Android Studio中如何获取sha1证书指纹数据debug.keystore
- Android 开发--CSDN博客大神汇总
- [Android] 使用 ViewFlipper 实现上下循环滚动通知栏
- android 打开相机/打开相册(版本兼容)-获取照片,压缩100K一下保存到本地
- 如何使用Android中hide的类和方法进行开发?
- Android开发那些坑
- Android Studio 导入External Libraries
- 安卓 启动软件 打开软件
- AndroidStudio查看SHA1h或者MD5
- Security and System Architecture: Comparison of Android Customizations 阅读笔记
- 单例模式的用处
- android开发中遇到的一些灵异事件(更新中...)
- Android中GPRS定位的实现
- Android带有边框的RelativeLayout、LinearLayout
- Android中使用抖动动画吸引来用户注意
- Android系统自带的一个图片剪裁页面裁剪后有黑边问题
- [转]六款值得推荐的android(安卓)开源框架简介