一、如何去编写BaseFragment?
开发过程中,使用到Fragment的场景还是很多的。有些项目,甚至整个项目就是用Fragment搭建。
那么如何能够愉快的使用Fragment?如何实现懒加载?下面就和大家一步步介绍。
二、开发时的业务流程和Fragment的创建流程
- 初始化数据,包括上个页面传递过来的数据
- 创建View。
- 初始化View。
- 网络访问后台加载数据。
- 懒加载的方法
- 其它的一些细节处理
三、Fragment的生命周期
onAttach()–>onCreate()–>onCreateView()–>>onViewCreated()–>>onDestroyView()–>>onDestroy()
话不多说,下面开始正文。
public abstract class BaseFragment extends Fragment implements IContract.IView {
private boolean isVisable;//是否可见
private boolean isInit;//是否加载过
public Presenter mPresenter;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(initLayout(), container, false);
//实例化p层
mPresenter = new Presenter();
mPresenter.onAttch(this);
return view;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initView(view);
isInit = true;
setLoad();
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
this.isVisable = isVisibleToUser;
setLoad();
}
private void setLoad() {
if (isVisable && isInit) {
setLazy();
isInit = false;
}
}
//找布局
protected abstract int initLayout();
//找控件
protected abstract void initView(View view);
//数据操作
protected abstract void setLazy();
}
通常在APP开发当中都会自定义一个抽象的BaseActivity,用作Acitvity的基类,主要是用来实现Activity的一些公共属性以及公共方法。一个优秀的BaseActivity,在一定程度上能够优化代码结构,降低耦合度,提高代码可读性,方便修改。
一般情况下BaseActivity,只会将Activity的一些公共部分进行集成,这也是设计BaseActivity基类其中一个准则。当然BaseActivity的设计还取决于当前应用要求。那么如何去设计BaseActivity基类呢?首先要明白BaseActivity基类能够做些什么。
public abstract class BaseActivity extends AppCompatActivity implements IContract.IView {
private NetUtil netUtil;
private IntentFilter intentFilter;
public Presenter mPresener;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(initLayout());
setReceiver();
//实例化p层
mPresener = new Presenter();
mPresener.onAttch(this);
//初始化控件
initView();
//处理数据
initData();
//沉浸式
ImmersionBar.with(this).init();
}
protected abstract int initLayout();
protected abstract void initView();
protected abstract void initData();
}