一、如何去编写BaseFragment?
开发过程中,使用到Fragment的场景还是很多的。有些项目,甚至整个项目就是用Fragment搭建。
那么如何能够愉快的使用Fragment?如何实现懒加载?下面就和大家一步步介绍。
二、开发时的业务流程和Fragment的创建流程
1. 初始化数据,包括上个页面传递过来的数据
2. 创建View。
3. 初始化View。
4. 网络访问后台加载数据。
5. 懒加载的方法
6. 其它的一些细节处理
三、Fragment的生命周期
onAttach()-->onCreate()-->onCreateView()-->>onViewCreated()-->>onDestroyView()-->>onDestroy()
在不同的生命周期,按顺序编写执行方法。
四、BaseFragment的编写
/**
* Fragment的基类
*/
public abstract class BaseFragment extends Fragment {
/**
* 用户设置的ContentView
*/
protected View mContentView;
/**
* View有没有加载过
*/
protected boolean isViewInitiated;
/**
* 页面是否可见
*/
protected boolean isVisibleToUser;
/**
* 是不是加载过
*/
protected boolean isDataInitiated;
private Activity mActivity;
@Override
public void onAttach(Context context) {
super.onAttach(context);
mActivity = (Activity) context;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initData(savedInstanceState);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mContentView = createContentView(container);
return mContentView;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (!isViewInitiated) {
initTitle();
bindView(view);
initView(view);
initNet();
}
isViewInitiated = true;
loadData();
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
this.isVisibleToUser = isVisibleToUser;
loadData();
}
@Override
public void onDestroyView() {
unbindView(mContentView);
super.onDestroyView();
}
@Override
public void onDestroy() {
mActivity = null;
mContentView = null;
super.onDestroy();
}
/**
* 创建View
*/
private View createContentView(ViewGroup parent) {
Object layout = getContentLayout();
View contentView = null;
if (layout instanceof View) {
contentView = (View) layout;
} else if (layout instanceof Integer) {
contentView = getLayoutInflater().inflate((Integer) layout, parent, false);
}
if (contentView == null) {
new IllegalArgumentException("getContentLayout must View or LayoutId");
}
return contentView;
}
protected abstract Object getContentLayout();
/**
* 1. 初始化数据,包括上个页面传递过来的数据在这个方法做
*/
protected void initData(Bundle savedInstanceState) {
}
/**
* 3.1 如果要创建标题
*/
protected void initTitle() {
}
/**
* 3.2绑定View
*/
protected void bindView(View contentView) {
}
/**
* 4. 初始化View
*/
protected void initView(View contentView) {
}
/**
* 5. 初始化网络
*/
protected void initNet() {
}
/**
* 懒加载
*/
private void loadData() {
if (isVisibleToUser && isViewInitiated && (!isDataInitiated)) {
isDataInitiated = true;
lazyLoad();
}
}
/**
* 6. 懒加载,Fragment可见的时候调用这个方法,而且只调用一次
*/
protected void lazyLoad() {
}
/**
* 解绑contentView
*/
protected void unbindView(View contentView) {
}
/**
* 打开Activity
*/
public final void startActivity(Class<?> clazz) {
startActivity(clazz, null);
}
/**
* 打开Activity
*/
public final void startActivity(Class<?> clazz, @Nullable Bundle options) {
Intent intent = new Intent(getAppActivity(), clazz);
if (options != null) {
intent.putExtras(options);
}
startActivity(intent);
}
/**
* 获取当前的Activity
*/
public final Activity getAppActivity() {
return mActivity;
}
/**
* 设置TextView
*/
public void setText(TextView textView, CharSequence text) {
if (textView != null && text != null) {
textView.setText(text);
}
}
/**
* 闭关页面
*/
public void finish() {
if (mActivity != null) {
mActivity.finish();
}
}
}
其实和BaseActivity一样,就多了个懒加载的方法。在ViewPager使用的时候可以使用懒加载的方法去后台请求数据,更新UI。
网友评论