Basefragment的封装使用
1、前言
封装作为面向对象的三大特性之一,在我们平时的coding过程用的那是非常的多的。大多数时候,我们可以根据封装情况评判代码的质量水平。
本文主要讲解的是fragment的封装。大体上,在项目的初期,我们都会在基类中把一些常用的东西封装起来,以供子类方便的调用。这用做的好处是显而易见的:
- 将一些共用的东西集中放在base基类中
- 方便后期修改维护
- 避免子类代码冗余
- 消除不必要的重复代码
- 方便子类的使用
2、开始封装
2.1 获取mActivity
在fragment中,我们可以通过getActivity()方法获取到当前依附的activity实例。但是如果在使用的时候直接获取有时候可能会报空指针,那么我们可以在fragment生命周期的onAttach(Context context)方法中获取到并提升为全局变量。
/**
* 贴附的activity
*/
protected FragmentActivity mActivity; @Override
public void onAttach(Context context)
{
super.onAttach(context); mActivity = getActivity();
}
2.2 onCreateView方法的封装
通常,我们需要在fragment的onCreateView方法中做一些初始化的事情,比如加载布局文件,findview,网络加载数据,初始化数据等,将这些事情都写在一个方法中显得onCreateView非常的庞大,我们可以分成几个方法抽离出来,这样代码既美观又方便阅读:
@Override
@Nullable
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState)
{
mRootView = inflater.inflate(setLayoutResouceId(), container, false); initData(getArguments()); initView(); mIsPrepare = true; onLazyLoad(); setListener(); return mRootView;
}
以上代码我们根据功能进行以下封装,注意方法调用顺序不可调换:
- setLayoutResouceId():设置布局资源id
- initData(getArguments()) :数据初始化,主要包括拆包从activity传递过来的参数,适配器初始化,集合初始化等,不可进行view的操作
- mIsPrepare置为true:mIsPrepare 表示是否已经加载view,该属性主要用于懒加载(下文会详细介绍懒加载)
- onLazyLoad():懒加载数据,在oncreatview方法中调用可以直接理解为加载数据,方法中可以进行view的操作
- setListener():各种监听事件的统一设置
2.3 field介绍
封装的属性代码注释已经写的很清楚了:
/**
* 贴附的activity
*/
protected FragmentActivity mActivity; /**
* 根view
*/
protected View mRootView; /**
* 是否对用户可见
*/
protected boolean mIsVisible;
/**
* 是否加载完成
* 当执行完oncreatview,View的初始化方法后方法后即为true
*/
protected boolean mIsPrepare;
2.4 封装的方法
以下封装的三个方法用于子类的实现:
/**
* 初始化数据
* @author 漆可
* @date 2016-5-26 下午3:57:48
* @param arguments 接收到的从其他地方传递过来的参数
*/
protected void initData(Bundle arguments)
{ } /**
* 初始化View
* @author 漆可
* @date 2016-5-26 下午3:58:49
*/
protected void initView()
{ } /**
* 设置监听事件
* @author 漆可
* @date 2016-5-26 下午3:59:36
*/
protected void setListener()
{ }
2.5 setLayoutResouceId方法
setLayoutResouceId()是一个抽象方法,子类必须实现,用于获取布局文件的资源id,加载到fragment中,并在onCreatview方法中用mRootView保存其引用
/**
* 设置根布局资源id
* @author 漆可
* @date 2016-5-26 下午3:57:09
* @return
*/
protected abstract int setLayoutResouceId();
2.6 打造专属的findViewById()方法
是不是很羡慕activity的findViewById()方法,在我们封装的basefragment中,也有自己的findViewById()方法,而且比activity的更加强大,因为它可以直接转化成我们相对应的view,而不需要强制转化。有了它,我们的fragment子类就可以直接使用了。
@SuppressWarnings("unchecked")
protected <T extends View> T findViewById(int id)
{
if (mRootView == null)
{
return null;
} return (T) mRootView.findViewById(id);
}
2.7 懒加载
何为懒加载,就是view没有与用户交互的话并不会加载,但是他的加载顺序又非常快。该方法主要在viewpager嵌套fragment中使用得多。我们都知道,viewpager可以提前加载左右指定数目(当然这个数目可以通过setOffscreenPageLimit(int limit)设置)的fragment,如果我们使用懒加载,就只会做些view的创建等操作,避免提前执行其他页面的网络请求。
一下代码中,setUserVisibleHint(boolean isVisibleToUser)表示是否与用户可交互,他在onCreatview方法前执行,当isVisibleToUser为true时表示对用户可见,在这里我们执行自定义的onVisibleToUser()
方法,在onVisibleToUser()中,我们进行判断,当mIsPrepare为true且与用户可交互时执行我们的onLazyLoad()方法进行懒加载。
@Override
public void setUserVisibleHint(boolean isVisibleToUser)
{
super.setUserVisibleHint(isVisibleToUser); this.mIsVisible = isVisibleToUser; if (isVisibleToUser)
{
onVisibleToUser();
}
} /**
* 用户可见时执行的操作
* @author 漆可
* @date 2016-5-26 下午4:09:39
*/
protected void onVisibleToUser()
{
if (mIsPrepare && mIsVisible)
{
onLazyLoad();
}
}
3 结束
好了,整个basefragment的封装就做好了,下面是完整代码,由于代码量不多,本篇博客就不上传完整demo了。
public abstract class BaseFragment extends Fragment
{
/**
* 贴附的activity
*/
protected FragmentActivity mActivity; /**
* 根view
*/
protected View mRootView; /**
* 是否对用户可见
*/
protected boolean mIsVisible;
/**
* 是否加载完成
* 当执行完oncreatview,View的初始化方法后方法后即为true
*/
protected boolean mIsPrepare; @Override
public void onAttach(Context context)
{
super.onAttach(context); mActivity = getActivity();
} @Override
@Nullable
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState)
{
mRootView = inflater.inflate(setLayoutResouceId(), container, false); initData(getArguments()); initView(); mIsPrepare = true; onLazyLoad(); setListener(); return mRootView;
} /**
* 初始化数据
* @author 漆可
* @date 2016-5-26 下午3:57:48
* @param arguments 接收到的从其他地方传递过来的参数
*/
protected void initData(Bundle arguments)
{ } /**
* 初始化View
* @author 漆可
* @date 2016-5-26 下午3:58:49
*/
protected void initView()
{ } /**
* 设置监听事件
* @author 漆可
* @date 2016-5-26 下午3:59:36
*/
protected void setListener()
{ } @Override
public void setUserVisibleHint(boolean isVisibleToUser)
{
super.setUserVisibleHint(isVisibleToUser); this.mIsVisible = isVisibleToUser; if (isVisibleToUser)
{
onVisibleToUser();
}
} /**
* 用户可见时执行的操作
* @author 漆可
* @date 2016-5-26 下午4:09:39
*/
protected void onVisibleToUser()
{
if (mIsPrepare && mIsVisible)
{
onLazyLoad();
}
} /**
* 懒加载,仅当用户可见切view初始化结束后才会执行
* @author 漆可
* @date 2016-5-26 下午4:10:20
*/
protected void onLazyLoad()
{ } @SuppressWarnings("unchecked")
protected <T extends View> T findViewById(int id)
{
if (mRootView == null)
{
return null;
} return (T) mRootView.findViewById(id);
} /**
* 设置根布局资源id
* @author 漆可
* @date 2016-5-26 下午3:57:09
* @return
*/
protected abstract int setLayoutResouceId();
}
Basefragment的封装使用的更多相关文章
- BaseActivity与BaseFragment的封装
这篇博客主要是从BaseActivity与BaseFragment的封装开始,总结我们在实战开发中关于Fragment的注意事项以及心得体会. 先看以下效果图: 这里模拟的是用户登录模块,你可能会说, ...
- Android 谈谈封装那些事 --BaseActivity 和 BaseFragment(二)
1.前言 昨天谈了BaseActivity的封装,Android谈谈封装那些事--BaseActivity和BaseFragment(一)有很多小伙伴提了很多建议,比如: 通用标题栏可以自定义Vi ...
- android手机安全卫士、Kotlin漫画、支付宝动画、沉浸状态栏等源码
Android精选源码 轻量级底部导航栏 android手机卫士源码 android实现高仿今日头条源码 一个用Kotlin写的简单漫画App源码 android吐槽项目完整源码 ...
- 总结界面框架_UI_Adapter
本人定期更新经典案例及解决方案如有疑问请联系我QQ1822282728 -- 277627117 下面是常用到的ui Demo 安卓三级筛选菜单listview(非常经典) http://dow ...
- 抽取的BaseFragment和LoadingPage
[BaseFragment]: public abstract class BaseFragment extends Fragment { /*★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ...
- Fragment与FragmentActivity通信封装
在项目里面会经常用到Fragment与FragmentActivity,比如Fragment之间的界面切换与Fragment之间的值传递等等,为了方便起见我把Fragment和FragmentActi ...
- EventBus简单封装
前言 以前每个页面与每个页面业务逻辑传递让你不知所措,一个又一个接口回调,让你晕头转向,一个又一个参数让你混乱不堪.EventBus一个耦合度低的让你害怕的框架. 什么是EventBus EventB ...
- MVP+Dagger2+Rxjava+Retrofit+GreenDao 开发的小应用,包括新闻、图片、视频3个大模块,代码封装良好
练习MVP架构开发的App,算是对自己学过的知识做一个总结,做了有一段时间,界面还算挺多的.代码量还是有的,里面做了大量封装,总体代码整理得非常干净,这个我已经尽力整理了. 不管是文件(java.xm ...
- 带你封装自己的MVP+Retrofit+RxJava2框架(一)
前言 文本已经收录到我的Github个人博客,欢迎大佬们光临寒舍:我的GIthub博客 看完本篇文章的,可以看下带你封装自己的MVP+Retrofit+RxJava2框架(二),里面封装得到了改进 本 ...
随机推荐
- linux关于readlink函数获取运行路径的小程序
http://blog.csdn.net/djzhao/article/details/8178375 相关函数: stat, lstat, symlink表头文件: #include <u ...
- poj 3271 Lilypad Pond bfs
因为有了1的存在,使得问题变得比较难搞了,所以比较简单的做法就是把1去掉,先做一次bfs,处理出每个点能够一步到达的点(一定是1步). 然后就可以在新图上用bfs算出两个点之间的最短路,和最短路的个数 ...
- [Angular 2] Rendering an Observable with the Async Pipe
Angular 2 templates use a special Async pipe to be able to render out Observables. This lesson cover ...
- SVN经常使用命令说明
SVN版本号:1.5 及更新版本号 名词说明: WC:Working Copy 你的工作区 Versioned:受控的:受版本号控制的 SVN是什么? SVN是开源的版本号控制系统. 比CVS很多其它 ...
- Asp.Net MVC 页面代码压缩筛选器-自定义删除无效内容
Asp.Net MVC 页面代码压缩筛选器 首先定义以下筛选器,用于代码压缩. /*页面压缩 筛选器*/ public class WhiteSpaceFilter : Stream { privat ...
- 大数据笔记07:大数据之Hadoop的HDFS(特点)
1. HDFS的特点: (1)数据冗余,硬件容错 (2)流式的数据访问(写一次读多次,不能直接修改已写入的数据,只能删除之后再去写入) (3)存储大文件 2. HDFS适用性和局限性 适用性:(1)适 ...
- android的task任务栈
转自http://blog.csdn.net/liuhe688/article/details/6761337 古人學問無遺力,少壯工夫老始成.紙上得來終覺淺,絕知此事要躬行.南宋.陸遊<冬夜讀 ...
- linux定时任务2-at命令
定时执行命令: [root@rheltest1 ~]# at now + 1 minute //一分钟后执行下面的任务 at> date >> /tmp/test_date.log ...
- Mosquitto安装_Ubuntu/Debian上安装消息队列Mosquitto
Mosquitto安装_Ubuntu/Debian上安装消息队列Mosquitto MQTT是IBM开发的一个即时通讯协议.MQTT是面向M2M和物联网的连接协议,采用轻量级发布和订阅消息传输机制.M ...
- JSON 格式化为易读格式的字符串
算法 http://blog.csdn.net/yanghaitaohhh/article/details/39672783 使用算法如下: 对输入字符串,逐个字符的遍历 1.获取当前字符. 2.如果 ...