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…

linux gentoo安装,Gentoo安装教程——萌新向

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼手动配置内核激动人心的时刻到了,手动配置内核!先下载内核源代码,官方推荐使用gentoo-source,然后进入源代码目录,进行设置。详细的设置可以看金步国的文章。这里我只说说…

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

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

android webview网页显示不完整,【报Bug】webview页面内容显示不全

详细问题描述更新到2.6.0之后,进入webview页面,嵌入的html页面无法完全显示,部分内容被遮挡[内容]重现步骤[步骤]进入webview页面[结果]内容无法完全显示,部分内容被遮挡[期望]内容显示正常[如果语言难以表述清晰,拍一…

无法创建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系统…

微信 小程序 python 渲染_你用python写过那些好玩的微信小程序?

教你用Py来玩跳一跳小程序教程项目地址 2017 年 12 月 28 日下午,微信发布了 6.6.1 版本,加入了「小游戏」功能,并提供了官方 DEMO「跳一跳」。 这是一个 2.5D 插画风格的益智游戏,玩家可以通过按压屏幕时间的长短来控制这个「小人…

android log.d 参数,Android log 机制 - logd 总览

Android 早期版本使用的是一个 log 驱动,后来逐渐使用 logd 进程替代(具体哪个版本我就没有去探究了,至少在 Android 8.0 里,log 驱动已经被移除)。原有 log 驱动负责的功能,都由 logd 完成。此外,logd 还可以读取 Lin…

python的requests模块功能_【python】requests模块初探(一)

一、写在前面 Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。Requests 的哲学是以 PEP 20 的习语为中心开发的&…

麒麟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…

python接入excel_通过Python导入Excel数据,实现自动化数据测试

一、安装openpyxl pip install openpyxl 二、获取Excel表格数据 以下是我的表格数据 #导入load_workbook工作表 from openpyxl import load_workbook #创建粘贴工作表数据的类 class ParseExcel(): #工作表路径及工作表的名字 def __init__(self,excelPath,sheetName): #加载表…

html长图转换成pdf,将长 html 导入拆分 PDF

我的情况是:单击按钮时,将 html 上的数据导入 PDF 文件。由于此 PDF 必须具有一些复杂的必需样式,因此我的第一步是使用 html2canvas.js 将此页面转换为图像,然后使用 jsPDF.js 将此图像导入 PDF当数据太大时,必须拆分…

python 魔法方法常用_python 常用的魔法方法

1. 构造方法 __new__(cls,[...) 对象实例化时第一个调用的方法,它只取下 cls 参数,并把其他参数传给 __init__ 。 __init__(self,[...]) 使用传入的参数来初始化实例,不能返回除了None的任何值。 __del__(self) 定义了当对象被垃圾回收时的行…

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

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

html css实现登录注册页面,基于HTML5+css+JS_的精美登陆注册界面

【实例简介】基于HTML5cssJS的精美登陆注册界面-------------------------------【实例截图】【核心代码】login4├── index.html├── resources│ ├── images│ │ ├── arrow.png│ │ ├── arrow-p.png│ │ ├── bg.png│ │ ├── btn.pn…

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…