三周半的时间,做完了第一份实习工作的第一个项目,虽然没有用到太复杂的知识,但是从基础角度长进不少,现在项目收尾,分几篇博客来总结一下在这里面学到的知识。
本文从整体来说。
学习了fragment,这个项目就基本全都是用fragment来做的。
“尽量少用new操作”–在一些可以重复利用的fragment上,采用类似单例模式的“私有实例,私有构造函数,public的get实例函数”,若不为null则直接返回该对象,null则new。
//私有实例
private static LoginSecondStep_Fragment loginSecondStep_fragment;
/**
* 私有构造函数
*
* @param phone
* @param AorB
*/
private LoginSecondStep_Fragment(String phone, boolean AorB) {
this.phone = phone;
this.AorB = AorB;
//只要执行new操作,就将原值更改
isNew = true;
}
/**
* 对外接口,返回实例
*
* @param phone
* @param AorB
* @param ifSendPhone
* @return
*/
public static LoginSecondStep_Fragment getMe(String phone, boolean AorB, boolean ifSendPhone) {
/**
* 只要需要上传手机号,就必须new
* 不上传手机号,但是null,就new
* 不上传,也不为空,直接返回
*/
if ((ifSendPhone) || (!ifSendPhone && loginSecondStep_fragment == null)) {
Log.i("second", "new");
loginSecondStep_fragment = new LoginSecondStep_Fragment(phone, AorB);
}
return loginSecondStep_fragment;
}
其次,fragment的切换
因为在同一个Activity上托管着很多fragment,我第一次做的切换,使用hide & show来做的,结果导致后面重用的时候,出现了bug,一个页面的倒计时,出现了计时混乱。
后来改用replace。
用replace的话,如果调用方不采用addToBackStack(null) 调用方则直接逐步执行生命周期函数,进入onDetach
采用addToBackStack(null)后,调用方不执行onDestory onDetach。(大量博客显示采用addToBackStack(null)并不是放进栈里,而是重新建立了一个新的实例区域,暂时不用,我还没仔细看)。
一些保存操作,上传数据操作,尽量放在生命周期函数里进行。
eg.
@Override
public void onPause() {
super.onPause();
//对上一页的姓名进行操作
if (getTargetFragment() == null) {
return;
} else {
Intent i = new Intent();
i.putExtra(Setting_Userinfo_Fragment.EXTRA, et.getText().toString().trim());
getTargetFragment().onActivityResult(getTargetRequestCode(), Setting_Userinfo_Fragment.REQUEST_Truename, i);
}
}
针对具体情况,具体分析生命周期,借助生命周期函数。
接下来仔细去写。