小记
1. 关于Fragment的初始化传参问题
我们在使用Avtivity+Fragment组合方式建立界面的时候,通常会在Activity中new若干个Fragment,但是在Fragment中需要传参数的时候,我们直接在Fragment中用构造函数的方式传参数会不会有问题呢?没错,我们在AndroidStudio中是用构造方法的方式传参数,会报错,简单是说:"Fragment中穿参数赋值的方式可能造成内存泄露问题",代码如下:
public MyFragment(Context mContext,List<String> list){ this.list = list; this.mContext = mContext; }
这一块代码会在MyFragment底下爆红,为什么呢?就是说要是用这种方式进行传参赋值的话,Fragment在销毁的时候,这些值可能还存在,所以就造成了内存泄漏.为什么?我也不知道,我老大告诉我的..,那要是想要传参赋值该怎么办?可以用如下代码来代替
public MyFragment(){} public static MyFragment getInstance(Context mContext,List<String> list){ MyFragment fragment = new Fragment(); Bubdle argument = new Bundle(); argument.putSerializable("CONTEXT",mContext); argument.putSerializable("LIST",list); fragment.setArgument(argument); return fragment; }
之后在外部取出想要的值赋值即可,这样就解决了报错的问题,并且Fragment在销毁的时候,数据也会没有;
2. String.Format()
我们在用数据进行显示的时候,可能会用到TextView,EditText等组件,所有可以SetText的都是,有些显示效果比如
-->发货明细: 重 33 吨,共 33 袋 3 个 充气娃娃<--
首先普通分析,我们需要一个"发货明细: 重"的TextView,一个"33"的TextView,一个"吨,共"的TextView,一个"33"的TextView,一个"袋"的TextView,一个"3"的TextView,一个"个"的TextView,最后一个"充气娃娃"的TextView,数一下1,2,3,4,5,6,7....8个TextView,在书写布局的时候,是不是显得有点麻烦,该怎么办?
其实我们只需要一个String.Format()的方法,外加一个正则表达式即可用一个TextView进行如上展示,上代码:
首先,需要在String.xml中配置 <string name = "string_tv_format">发货明细: 重 %1$s 吨,共 %2$s 袋 %3$s 个 %4$s </string> 然后我们在代码中这样玩 // 第一个参数是正则表达式,之后的参数 是可变参数,和你定义的String.xml中的%x$s是一一对应的 tvOrderDesc.setText(String.Format(getResources().getString(resId),strWeight,strCount1,strCount2,strName));
这样就可以了..
3. isAssignableFrom(Class class)
在编写Android项目的时候,有时候会遇到界面共用但是数据不共用的情况,这种情况就需要判断是哪一个界面跳转过来的并且做相应的请求数据,加载界面,设置响应事件,笔者寻找了几种办法,但是都被老大给否决了;后来老大给我提供了一种办法,就是如标题所示;我下面列举一下我的两种方式和老大给我的这种方式的用法,其实大致相同,只不过是给大家提供一个这一类问题的思路而已;
首先第一种: 用一个actId作为一个Activity的唯一标识,在跳转到下一个界面的时候用intent来判断这个actId是多少,用此种方式来判断应该做哪一种数据请求,应该给哪一个事件; 缺点:需要开发者记住每一个Activity的id,当activity过多的时候,可能会有混淆问题,若是在一个常亮类中定义了常量值,这不也是多了一步调用么; 然后第二种: 在进行界面跳转的时候传一个Class过去,就是当前的Activity,在跳转之后的界面进行如下判断; clazz(传过来的Class).getName().equal("MainActivity"(上一个界面)); 优点:不用记录Id了; 缺点:若是由于后期维护修改,类名改变了,这个字符串中的内容也要响应改变,不利于维护; 最后,老大给我的方法: 同样是在界面跳转的时候传一个Class过去,在跳转之后的界面,进行如下判断; clazz.isAssignableFrom(MainActivity.class); 这个方法的作用是判断指定类是不是当前类或者当前类的父类,一般情况下,activity是没有子父类关系的,唯一一个可能就是需要一个BaseActivity,但是我们也不会用BaseActivity进行界面跳转啊; 优点:在类名进行改变的时候,相关引用也会自动改变; 缺点:不排除有特殊情况,会发生子类Activity跳转问题;(但是这是极特殊的情况,可忽略);