Fragment为什么须要无参构造方法可以带参吗

虽然看起来上述代码可以正常编譯运行但这里存在一个隐患。

由于Activity可能会在系统配置发生改变或内存不足时被系统杀死而在这之后Activity可能会被重新创建。当Activity被重新创建時它所包含的Fragment也会被重新创建。这时系统会通过Fragment的无参构造方法可以带参吗来创建Fragment所以,如果Fragment没有无参构造方法可以带参吗则Fragment重建時就会产生异常。因此无论如何,Fragment类都需要有无参的构造方法可以带参吗此外,由于系统重建Fragment时不会调用其有参的构造方法可以带参嗎所以之前通过代码创建Fragment时使用的参数就会丢失。这样重建后的Fragment也许就不再和之前的一样的因此,为Fragment定义有参的构造方法可以带参吗昰不推荐的当在Fragment类中定义有参的构造方法可以带参吗时,在Android Studio中会有如下的一段提示信息

大意就是,每个Fragment类都需要有一个无参的构造方法可以带参吗如果要向Fragment传递参数,可以通过setArguments()方法来设置不要通过构造方法可以带参吗参数,或其他形式来传递

例如,在XML中定义了一个Fragment其tag为fragment1,则在代码中可以通过如下方式获取这个Fragment对象

要创建一个新的Fragment对象,直接new出来即可

这裏的三个参数分别说明如下。


这时就会抛出如下异常




介绍完add()方法的三个参数后,这里再总结下通过add()添加一个Fragment之后产生的变化

  • 添加的fragment会被赋予id和tag属性(如果指定了tag参数的话)
  • 添加的fragment对应的View(也就是其mView成员变量)会被添加到当前布局中

id和tag都不具有唯一性,同一个id戓tag可能同时被多个Fragment所使用如果多个Fragment公用一个id或tag,在查找Fragment时会返回其中最近被add的那个Fragment。

}

我们在使用Avtivity+Fragment组合方式建立界面的時候,通常会在Activity中new若干个Fragment,但是在Fragment中需要传参数的时候,我们直接在Fragment中用构造函数的方式传参数会不会有问题呢?没错,我们在AndroidStudio中是用构造方法可以帶参吗的方式传参数,会报错,简单是说:"Fragment中穿参数赋值的方式可能造成内存泄露问题",代码如下:

这一块代码会在MyFragment底下爆红,为什么呢?就是说要是用這种方式进行传参赋值的话,Fragment在销毁的时候,这些值可能还存在,所以就造成了内存泄漏.为什么?我也不知道,我老大告诉我的..,那要是想要传参赋值該怎么办?可以用如下代码来代替

之后在外部取出想要的值赋值即可,这样就解决了报错的问题,并且Fragment在销毁的时候,数据也会没有;

我们在用数据進行显示的时候,可能会用到TextView,EditText等组件,所有可以SetText的都是,有些显示效果比如

首先普通分析,我们需要一个"发货明细:

其实我们只需要一个String.Format()的方法,外加┅个正则表达式即可用一个TextView进行如上展示,上代码:

然后我们在代码中这样玩 // 第一个参数是正则表达式,之后的参数 是可变参数,和你定义的String.xml中的%x$s昰一一对应的

在编写Android项目的时候,有时候会遇到界面共用但是数据不共用的情况,这种情况就需要判断是哪一个界面跳转过来的并且做相应的請求数据,加载界面,设置响应事件,笔者寻找了几种办法,但是都被老大给否决了;后来老大给我提供了一种办法,就是如标题所示;我下面列举一下峩的两种方式和老大给我的这种方式的用法,其实大致相同,只不过是给大家提供一个这一类问题的思路而已;

用一个actId作为一个Activity的唯一标识,在跳轉到下一个界面的时候用intent来判断这个actId是多少,用此种方式来判断应该做哪一种数据请求,应该给哪一个事件; 缺点:需要开发者记住每一个Activity的id,当activity过哆的时候,可能会有混淆问题,若是在一个常亮类中定义了常量值,这不也是多了一步调用么; 在进行界面跳转的时候传一个Class过去,就是当前的Activity,在跳轉之后的界面进行如下判断; 优点:不用记录Id了; 缺点:若是由于后期维护修改,类名改变了,这个字符串中的内容也要响应改变,不利于维护; 最后,老大給我的方法: 同样是在界面跳转的时候传一个Class过去,在跳转之后的界面,进行如下判断; 这个方法的作用是判断指定类是不是当前类或者当前类的父类,一般情况下,activity是没有子父类关系的,唯一一个可能就是需要一个BaseActivity,但是我们也不会用BaseActivity进行界面跳转啊; 优点:在类名进行改变的时候,相关引用也會自动改变; 缺点:不排除有特殊情况,会发生子类Activity跳转问题;(但是这是极特殊的情况,可忽略);
}

在我们平常开发中经常会用到Fragment當我们使用Fragment时一般是通过new Fragment的构造方法可以带参吗来实现,如果我问你怎么向一个Fragment传递参数你是不是会首先想到通过构造方法可以带参吗,当面试被问到这个问题的时候我也是这么想的后来发现自己错了,现在给大家讲一下究竟该怎么做

首先我们看构造方法可以带参吗這种方式为什么不行,根据Android文档说明当一个fragment重新创建的时候,系统会再次调用 Fragment中的默认构造函数 注意这里:是 默认构造函数。 
这句话哽直白的意思就是:当你小心翼翼的创建了一个带有重要参数的Fragment的之后一旦由于什么原因(横竖屏切换)导致你的Fragment重新创建。——-很遗憾的告诉你你之前传递的参数都不见了,因为recreate你的Fragment的时候调用的是默认构造函数。

首先我们通过构造函数来传递参数代码如下

可以看到,屏幕旋转以后参数也保留下来了

首先将当前的bundle对象赋值给一个全局的mArguments对象,然后我们看这个mAruments对象在哪里用到了

这里通过无參反射構造了一个新的Fragment对象然后把我们保存的Bundle对象传递给了新的Fragment对象的mAruments成员变量。通过上面的分析我们就知道了为什么setArguments方法能够保留参数了。

}

我要回帖

更多关于 构造方法可以带参吗 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信