android 基类封装用法,Android 基类封装之Fragment【原创】

现在的Android开发中,Activity和Fragment都是必不可少的,正如上篇博客所写,我们都会封装一个基类的Activity来做一些公共基础的操作。对于Fragment应用的越发广泛,在实际开发中,我们也应当封装一个基础的Fragment,让逻辑代码更加清晰,也利于后期的维护和可读性。

直接上代码,首先是几个变量:

protected View mRoot;

protected Unbinder mRootUnBinder;

protected boolean mIsFirstInitData = true;

其中,mRoot是Fragment的布局,mRootUnbinder看他的类型就知道,是因为引入了ButterKnife,所以定义这个Unbinder变量,用于后面的控件绑定。而boolean型变量mIsFirstInitData,顾名思义,用于判断是否是第一次初始化数据,用于避免每次加载时都刷新数据,详细看后面的代码。

接下来是onAttach方法:

@Override

public void onAttach(Context context) {

super.onAttach(context);

//初始化参数

initArgs(getArguments());

}

这里只有一个initArgs方法,用于初始化参数,具体实现由子类复写,做具体的业务逻辑。

然后是onCreateView方法:

@Nullable

@Override

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

if (mRoot == null) {

int layId = getContentLayoutId();

//初始化当前的根布局,但是不在创建时就添加到container里面

View root = inflater.inflate(layId, container, false);

initWidget(root);

mRoot = root;

} else {

if (mRoot.getParent() != null) {

//把当前Root从其父控件中移出

((ViewGroup) mRoot.getParent()).removeView(mRoot);

}

}

return mRoot;

}

在这里面先做判断,当前mRoot如果为null,则通过getContentLayoutId方法拿到布局文件的Id,然后通过inflater拿到view,再调用initWidget方法初始化控件,在initWidget方法中调用ButterKnife框架,详细代码后面贴。且将拿到的root赋值给mRoot。若mRoot不为null,则尝试将mRoot从其父控件移出,最后将mRoot返回。

接下来是onViewCreated方法:

@Override

public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {

super.onViewCreated(view, savedInstanceState);

if(mIsFirstInitData) {

mIsFirstInitData = false;

onFirstInit();

}

//当View创建完成后初始化数据

initData();

}

这里首先就用到了mIsFirstInitData这个变了,如果是第一次加载,则调用onFirstInit这个方法,进行第一次的一些必要的初始化操作,然后调用initData方法进行初始化数据。当然,这两个初始化的方法也都是交由子类复写,做具体需要的业务逻辑。

最后在定义一个返回值是boolean类型的onBackPressed方法:

public boolean onBackPressed() {

return false;

}

如果有子类重写了onBackPressed这个方法,对返回键做了具体的自己的处理,那么就返回true,这个用于Activity中返回键处理时判断子Fragment有没有已经多返回键做了具体处理,具体方法上篇Activity中有写。

最后贴上完整代码:

public abstract class Fragment extends android.support.v4.app.Fragment {

protected View mRoot;

protected Unbinder mRootUnBinder;

protected boolean mIsFirstInitData = true;

@Override

public void onAttach(Context context) {

super.onAttach(context);

//初始化参数

initArgs(getArguments());

}

@Nullable

@Override

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

if (mRoot == null) {

int layId = getContentLayoutId();

//初始化当前的根布局,但是不在创建时就添加到container里面

View root = inflater.inflate(layId, container, false);

initWidget(root);

mRoot = root;

} else {

if (mRoot.getParent() != null) {

//把当前Root从其父控件中移出

((ViewGroup) mRoot.getParent()).removeView(mRoot);

}

}

return mRoot;

}

@Override

public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {

super.onViewCreated(view, savedInstanceState);

if(mIsFirstInitData) {

mIsFirstInitData = false;

onFirstInit();

}

//当View创建完成后初始化数据

initData();

}

/**

* 初始化相关参数

*

* @param bundle 参数Bundle

* @return 如果参数初始化正确返回true,错误返回false

*/

protected void initArgs(Bundle bundle) {

}

/**

* 得到当前界面的资源文件Id

*

* @return 资源文件Id

*/

protected abstract int getContentLayoutId();

/**

* 初始化控件

*/

protected void initWidget(View root) {

mRootUnBinder = ButterKnife.bind(this, root);

}

/**

* 初始化首次数据

*/

protected void onFirstInit() {

}

/**

* 初始化数据

*/

protected void initData() {

}

/**

* 返回按键触发时调用

*

* @return 返回true代表我已处理返回逻辑,Activity不用自己Finish

* 返回false代表我没有处理逻辑, Activity自己走自己的逻辑

*/

public boolean onBackPressed() {

return false;

}

}

转载时请注明出处及相应链接,本文永久地址:https://blog.yayuanzi.com/22303.html

75d087ef9a9fb11dc373caaf33adbf7f.png

微信打赏

支付宝打赏

感谢您对作者rick的打赏,我们会更加努力!    如果您想成为作者,请点我

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499121.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fastjson 序列化 不包括转义字符_Java 反序列化工具 gadgetinspector 初窥 (上)

作者:Longofo知道创宇404实验室时间:2019年9月4日起因一开始是听Badcode师傅说的这个工具,在Black Hat 2018的一个议题提出来的。这是一个基于字节码静态分析的、利用已知技巧自动查找从source到sink的反序列化利用链工具。看了几遍作者在Bla…

char类型怎么输入 c语言_C语言中的char

C语言中的char是用于声明单个字符的关键字。char关键字具有一些很奇怪的特点,但是想要了解这些奇怪的特点为什么会存在,我们就要先了解char关键字的原理。char关键字会在内存中找到一字节的空闲空间,并且在里面写入一个从0到255的整型&#x…

无法创建ole db取值函数。请查看列元数据是否有效_[C++ Primer plus 心得]3.处理数据...

本章内容包括:C变量的命名规则。C内置的整型----unsigned long、long、unsigned int、int、unsigned short、short、char、unsigned char、singed char 和boot。C11新增的整型:unsigned long long 和long long。表示各种整型的数字字面值(常量)使用const…

android+ios打印机,Android/iOS手机安装HP打印机的详细方法和操作步骤

如今人们越来越依赖手机,手机几乎成为了生活必需品,其功能越来越多,对其他电子设备的操控能力也越来越强,那么手机如何操控打印机呢?今天小编就跟大家分享一下手机是如何通过无线安装打印机的。备注:本文以Android系统…

麒麟980可以升级鸿蒙吗,这五部麒麟980手机确定能升鸿蒙OS,其中有你吗?

原标题:这五部麒麟980手机确定能升鸿蒙OS,其中有你吗?就在今年九月的华为开发者大会上,余承东“一不小心”吐露出EMUI 11明年能升级鸿蒙OS 2.0的事实,这让许多华为用户兴奋不已,但首先你的手机必须要先能升…

python没有指针如何实现链表_Java、Python中没有指针,怎么实现链表、图等数据结构?...

Java、Python中没有指针,怎么实现链表、图等数据结构? (2016-10-06 11:08:19) 分类: C 其实Java, python完全可以看成在语言层用语法糖隐藏了指针。JAVA中到处充满指针,只不过把C中的指针封装成了对象的引用了,引用就相…

android语言列表+波斯,Android 多语言入门及实战

右键res,选择 New Resource Directory ,选择 locale ,选择自己想要适配的语言类型设置应用内多语言Android 7.0以下/*** 设置多语言*/public void setConfiguration(LocaleList locales, Context context) {Configuration configuration context.getResources().ge…

c# 从地址拷贝byte_面试必备的 “零拷贝” 问题!从头给你说!

本文作者:ksfzhaohui来源:juejin.im/post/5cad6f1ef265da039f0ef5df前言I/O概念1.缓冲区2.虚拟内存3.mmapwrite方式4.sendfile方式Java零拷贝1.MappedByteBuffer2.DirectByteBuffer3.Channel-to-Channel传输Netty零拷贝其他零拷贝总结前言从字面意思理解…

lda 可以处理中文_中文分词(jieba)和语料库制作(gensim)

本文的内容为以下两个部分:文本分词(jieba)语料库制作(gensim)结巴(jieba)分词在自然语言处理领域中,分词和提取关键词都是对文本处理时通常要进行的步骤。用Python语言对英文文本进…

js时间搓化为今天明天_秋冬国产搓背神器!360°无死角,让你搓背不求人,太舒服了...

秋冬国产搓背神器!360无死角,让你搓背不求人,太舒服了!夏季悄然离去,秋季快步走来,距离冬季也不远了~天气变冷以后,下班、放学回家了最惬意不过的就是洗个澡,如果泡完澡再搓个背&…

用html制作广告图片切换效果,基于jquery实现图片广告轮换效果代码

效果图:实现代码:hotmarquee*{margin: 0;padding: 0;}body{font: 12px;padding-top: 50px;padding-right: 200px;padding-bottom: 100px;padding-left: 200px;}ul{list-style: none;}img{padding: 2px;border: 1px solid #eee;}a{outline: none;}#imgs{width: 410px;margin-rig…

matplotlib柱状图上方显示数据_Python数据分析matplotlib可视化之绘图!

Matplotlib是一个基于python的2D画图库,能够用python脚本方便的画出折线图,直方图,功率谱图,散点图等常用图表,而且语法简单。Python中通过matplotlib模块的pyplot子库来完成绘图。Matplotlib可用于创建高质量的图表和…

应付账款账龄分析模板_企业财务报表分析论文应如何着手?

首先是企业的选择,最好选取上市公司进行分析,上市公司的财务数据比较透明,完全可以从新浪财经、中国证券网等平台获得详尽的报表数据资料,一般选取近三到五个年度。有了数据就可以着手分析了,我们可以从下面几个方法入…

dbeaver导入excel文件_PyQT5练习:制作Excel文件导入MySQL窗口

本文环境配置:系统>windows10:64位工具>PyCharm:2018.3.1语言>Python:3.7.1第三方库PyQT5:5.11.3pyqt5-tools:5.11.3.1.4PyMySQL:0.9.3openpyxl:2.5.12练手:制作…

编程中的蛇形填空问题_PCB—蛇形线的作用,这次真的是把你搞懂了

经常能看到论坛里有人在问蛇形线的问题。平时我们能看到蛇形线的地方大都是一些高速高密度板,好像带有蛇形线的板子就更高级,会画蛇形线就是高手了。网上关于蛇形线的文章也有很多,总感觉有些帖子的内容会误导新手,给人们带来困扰…

html5控制gif速度,gif加速软件 教你加快GIF图片的播放速度

一位狸友在编辑GIF动态图片时碰到了一个问题,就是不知怎么把GIF动画的播放速度加快(或减慢)。如果你也正巧碰到此类疑问或想知道GIF加速的方法,可以接着往下看哦。其实先理解了GIF动画的原理,并找对合适的gif编辑软件,解决这问题并…

android studio mvvm模板生成_使用Vue快速生成shape背景图

写在前面在日常的Android开发之中,我们通常都会根据UI图去手动创建shape或者selector背景图,虽说创建起来很简单,但是未免也会感到繁琐,因此也研究了一些这方面的知识,包括自定义shapedrawable、dataBinding&#xff0…

python 句子中没有中文_人生感悟经典句子,生活中可以没有诗歌,但不能没有诗意...

也曾有过一些热忱和勇气,为了自以为的命中注定颠沛流离,本想有一段花好月圆,却未曾想过就此天各一方。不是不爱,不是不会爱,只是少了坚持走下去的勇气。想必这是很多人的心声。错过抑或过错,都是爱情里常有…

图像迁移风格保存模型_图像风格迁移也有框架了:使用Python编写,与PyTorch完美兼容,外行也能用...

原标题:图像风格迁移也有框架了:使用Python编写,与PyTorch完美兼容,外行也能用选自Medium作者:Philip Meier 机器之心编译 编辑:陈萍 易于使用的神经风格迁移框架 pystiche。 将内容图片与艺术风格图片进行…

vivo设置全屏后状态栏黑色_vivo手机用2年内存占满,是这3个功能捣乱,一键按下全部释放...

vivo手机用2年内存占满,是这3个功能"捣乱",一键按下全部释放经常使用手机如果没有清理习惯,那么应用一多,产生的文件就会变多,这样手机就会没用2年就出现卡顿的现象。今天来教大家怎样一键释放vivo手机内存。…