这篇讲两个内容,因为感觉内容都太少了,所以就合起来写一篇算了。
一.Fragment懒加载(四)对Fragment的封装
我之前写过一篇文章说过要实现Fragment的懒加载,要定义3个参数,如果进行懒更新的话还要加一个参数,所以想想如果你的每个fragment都要定义4个参数,至少我觉得这样的代码扩展性不是很好,所以我就写了个LazyFragment对懒加载的操作进行封装。
顺便一提我对“懒”的使用:
我在项目中大量的使用了懒加载和懒更新,可以说我觉得这个思想非常的爽,我这边项目就我这个端做了懒加载,比如你有一个viewpager有3个fragment,其它端的操作是如果更新的话,这3个页面都要重新请求一次数据,而我这边用了懒更新后,我可以实现两个功能,一是只在切换页面后才进行数据重写加载,二是我可以很方便的选择只有某个Fragment进行懒更新,那就非常的爽啊。
话不多说,直接上代码,只要继承你原本写的Fragment基类,然后让其它类继承LazyFragment就行
public abstract class LazyFragment extends BaseFragment{
//定义3个布尔值来做懒加载的判断
private boolean isFristShowFragment = true;
private boolean isVisibleToUser;
private boolean isInitView = false; // 是否执行过initview
//懒加载
private boolean isNeedDelayedRequestAgain = false;
/**
* 防止ViewPager预加载而设置懒加载,该方法调用在onCreate前
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
this.isVisibleToUser = isVisibleToUser;
if (isVisibleToUser && isFristShowFragment && isInitView){
initView(rootView);
return;
}
// 判断是否进行延迟更新
if (isNeedDelayedRequestAgain && isVisibleToUser && !isFristShowFragment){
isNeedDelayedRequestAgain = false;
replaceSetData();
}
}
@Override
protected void initView(View view) {
isInitView = true;
// 显示并且第一次展示这个页面才进入判断
if (isVisibleToUser && isFristShowFragment){
isNeedDelayedRequestAgain = false;// 防止重复加载
isFristShowFragment = false;
fristInitView(rootView);
fristToData();
}
}
// 第一次初始化
protected abstract void fristInitView(View rootView);
// 第一次获取数据
protected abstract void fristToData();
// 懒加载时重新获取数据
public void replaceSetData(){
}
@Override
protected void setDataToView() {
}
public void setNeedDelayedRequestAgain(boolean needDelayedRequestAgain) {
isNeedDelayedRequestAgain = needDelayedRequestAgain;
}
}
代码很简单,流程上的懒加载是封装好的,然后如果要使用懒更新功能的话。要在具体的fragment中重写replaceSetData()方法,在里面写上你的请求网络的操作就行。然后调用setNeedDelayedRequestAgain()就能传入是否进行懒更新。
二.EditText在Popupwindow中的BUG
我之前的弹框都是封装Popupwindow来使用的,自己封装后确实使用得非常方便,可谁知道竟然会出现了细微的BUG,这让我心疼不已,其实我很不明白为什么谷歌对弹框要推出这么多个实现方法,也许是我太菜了,无法理解谷歌的良苦用心。
回头说说这个BUG,就是在Popupwindow使用EditText的时候,无法实现长按复制粘贴功能,这个功能叫做selection markers。
我感觉我之前白封装了,在网上查阅了大量的资料包括stackoverflow,都只说了一句话,没救了,用DialogFragment代替。
以后写弹框用DialogFragment
以后写弹框用DialogFragment
以后写弹框用DialogFragment
重要的事说三遍。