您的位置:首页 > 移动开发 > Android开发

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

2016-06-12 10:29 363 查看
原文链接:Using newInstance() to Instantiate a 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(…)调用的时候将这些参数取出来。

简单总结:

使用Fragment.setArguments(Bundle bundle)这种方式来传递参数,而不要通过构造方法直接来传递参数。

原因:

我们可以知道Activity重新创建时,会重新构建它所管理的Fragment,原先的Fragment的字段值将会全部丢失,但是通过Fragment.setArguments(Bundle bundle)方法设置的bundle会保留下来。所以尽量使用Fragment.setArguments(Bundle bundle)方式来传递参数。

参考:http://www.cnblogs.com/kissazi2/p/4127336.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: