android自定义实例化,实例化新Android片段的最佳实践

虽然@yydl给出了一个令人信服的理由,说明为什么该newInstance方法更好:如果Android决定稍后重新创建Fragment,它将调用片段的无参数构造函数。所以重载构造函数不是一个解决方案。

它仍然可以使用构造函数。要了解其原因,首先我们需要了解Android为何使用上述解决方法。

在使用片段之前,需要一个实例。Android调用YourFragment()(无参数构造函数)来构造片段的实例。在这里,您编写的任何重载构造函数都将被忽略,因为Android无法知道要使用哪一个。

在Activity的生命周期中,片段如上所述创建并被Android多次销毁。这意味着如果将数据放入片段对象本身,则一旦片段被销毁,它将丢失。

为解决方法,android要求您使用Bundle(调用setArguments())存储数据,然后可以从中访问YourFragment。参数bundle受Android保护,因此保证是持久的。

设置此捆绑包的一种方法是使用静态newInstance方法:public static YourFragment newInstance (int data) {

YourFragment yf = new YourFragment()

/* See this code gets executed immediately on your object construction */

Bundle args = new Bundle();

args.putInt("data", data);

yf.setArguments(args);

return yf;}

但是,构造函数:public YourFragment(int data) {

Bundle args = new Bundle();

args.putInt("data", data);

setArguments(args);}

可以做与newInstance方法完全相同的事情。

当然,这会失败,这也是Android希望您使用该newInstance方法的原因之一:public YourFragment(int data) {

this.data = data; // Don't do this}

作为进一步的解释,这里是Android的片段类:/**

* Supply the construction arguments for this fragment.  This can only

* be called before the fragment has been attached to its activity; that

* is, you should call it immediately after constructing the fragment.  The

* arguments supplied here will be retained across fragment destroy and

* creation.

*/public void setArguments(Bundle args) {

if (mIndex >= 0) {

throw new IllegalStateException("Fragment already active");

}

mArguments = args;}

请注意,Android要求仅在构造时设置参数,并保证这些参数将被保留。

编辑:正如@JHH的评论所指出的,如果你提供一个需要一些参数的自定义构造函数,那么Java将不会为你的片段提供一个没有arg的默认构造函数。因此,这需要您定义一个无参数构造函数,这是您可以使用newInstance工厂方法避免的代码。

编辑:Android不再允许使用重载构造函数的片段。您必须使用该newInstance方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值