Android快速开发之定制BaseTemplate
本篇内容有:
定制baseactivity
定制basefragment
定制baseapplication
前言
初学者肯定会遇到一个日常任务,那么就是findviewbyid,setonclicklistener(暂且把它们称为日常任务),而且很多人会把他们混在一起,导致项目结构混乱,最主要的是写多了会烦,不觉得吗?当项目的activity越多时,每次添加控件都要重新写一次,想想都累
tv_cz_10 = (textview) findviewbyid(r.id.tv_cz_10); tv_cz_20 = (textview) findviewbyid(r.id.tv_cz_20); tv_cz_30 = (textview) findviewbyid(r.id.tv_cz_30); tv_cz_50 = (textview) findviewbyid(r.id.tv_cz_50); tv_cz_10.setonclicklistener(this); tv_cz_20.setonclicklistener(this); tv_cz_30.setonclicklistener(this); tv_cz_50.setonclicklistener(this);
定制解决的问题:尽量写少的代码,做更多事
定制的目的:理清代码结构,让你编程更有逻辑性
定制的内容:一切都是根据项目的需求去实现
定制baseactivity
我们就针对日常任务简单的定制一份我们的baseactivity
public abstract class baseactivity extends fragmentactivity implements view.onclicklistener { private sparsearray<view> mviews; public abstract int getlayoutid(); public abstract void initviews(); public abstract void initlistener(); public abstract void initdata(); public abstract void processclick(view v); public void onclick(view v) { processclick(v); } @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); mviews = new sparsearray<>(); setcontentview(getlayoutid()); initviews(); initlistener(); initdata(); } /** * 通过id找到view */ public <e extends view> e findview(int viewid) { e view = (e) mviews.get(viewid); if (view == null) { view = (e) findviewbyid(viewid); mviews.put(viewid, view); } return view; } /** * view设置onclick事件 */ public <e extends view> void setonclick(e view){ view.setonclicklistener(this); } }
代码其实很简单,光从代码可能不知道这段代码的意思,那么就从实现这段代码来理解它的真正作用,下面是实现baseactivity的代码
public class searchactivity extends baseactivity { bannercontroller bannercontroller; shopcontroller shopcontroller; private imageview iv_zxing; private textview tv_sure; @override public int getlayoutid() { //这里用来获取activity的layout return r.layout.activity_search; } @override public void initviews() { //这里用来初始化view iv_zxing = findview(r.id.iv_zxing); tv_sure = findview(r.id.tv_sure); } @override public void initlistener() { //这里用来初始化点击事件 setonclick(iv_zxing); setonclick(tv_sure); } @override public void initdata() { //这里用来设置数据、获取数据、读取网络数据、这里所做的一切都可以在controller实现 bannercontroller = new bannercontroller(getactivity()); shopcontroller = new shopcontroller(getactivity()); initshop(); initbanner(); } @override public void processclick(view v) { //这里用来处理点击事件 switch (v.getid()) { case r.id.iv_zxing: break; case r.id.tv_sure: break; } } private void initshop() { } private void initbanner() { } }
是不是觉得代码结构很清晰,而且比起之前的日常任务来说,代码确实少了不少,各个方法都放着自己应该做的事情,这样能保证你在编程的时候逻辑不会出错,让别人读起来也很轻松,当然,除了常用的setonclicklistener还有setonitemclicklistener,这就需要根据项目需要而定制
如果你是很酷很有性格的人,那么也可以尝试下面这种用法,用一个字母作为方法,一切定制因你心情而定
public <e extends view> e f(int viewid) { e view = (e) mviews.get(viewid); if (view == null) { view = (e) findviewbyid(viewid); mviews.put(viewid, view); } return view; } public <e extends view> void c(e view){ view.setonclicklistener(this); } //用起来也很帅哦 @override public void initviews() { iv_zxing = f(r.id.iv_zxing); tv_sure = f(r.id.tv_sure); } @override public void initlistener() { c(iv_zxing); c(tv_sure); }
定制basefragment
介绍完了activity,那么fragment就很简单了,可以模仿activity实现,如果和上面的一模一样那么就没有乐趣了,这里由于个人项目原因,我把fragment默认设置成了懒加载模式,并且只加载一次数据
public abstract class basefragment extends fragment implements view.onclicklistener { private boolean isvisible = false; private boolean isinitview = false; private boolean isfirstload = true; public view convertview; private sparsearray<view> mviews; public abstract int getlayoutid(); public abstract void initviews(); public abstract void initlistener(); public abstract void initdata(); public abstract void processclick(view v); @override public void onclick(view v) { processclick(v); } @override public void setuservisiblehint(boolean isvisibletouser) { super.setuservisiblehint(isvisibletouser); if (isvisibletouser) { isvisible = true; lazyload(); } else { //设置已经不是可见的 isvisible = false; } } @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { mviews = new sparsearray<>(); convertview = inflater.inflate(getlayoutid(), container, false); initviews(); isinitview = true; lazyload(); return convertview; } //懒加载 private void lazyload() { if (!isfirstload || !isvisible || !isinitview) { //如果不是第一次加载、不是可见的、不是初始化view,则不加载数据 return; } //加载数据 initlistener(); initdata(); //设置已经不是第一次加载 isfirstload = false; } public <e extends view> e findview(int viewid) { if (convertview != null) { e view = (e) mviews.get(viewid); if (view == null) { view = (e) convertview.findviewbyid(viewid); mviews.put(viewid, view); } return view; } return null; } public <e extends view> void setonclick(e view){ view.setonclicklistener(this); } }
这里和activity最大的区别
1.convertview:由于fragment的findid需要convertview,我们只好抽取出来
2.setuservisiblehint:这个方法当切换fragment时会调用,会返回当前fragment是否用户可见
public class homefragment extends basefragment { shopcontroller shopcontroller; private imageview iv_speech; private textview tv_search; @override public int getlayoutid() { return r.layout.fragment_home; } @override public void initviews() { iv_speech = findview(r.id.iv_speech); tv_search = findview(r.id.tv_search); } @override public void initdata() { shopcontroller = new shopcontroller(getactivity()); initshop(); } @override public void initlistener() { setonclick(iv_speech); setonclick(tv_search); } @override public void processclick(view v) { switch (v.getid()) { case r.id.iv_speech: break; case r.id.tv_search: break; } } private void initshop() { } }
这里采用的是viewpager+fragment,如果需要让fragment进行缓存,那么必须对viewpager进行缓存设置
//设置缓存页面 viewpager.setoffscreenpagelimit(5);
下面是设置了缓存的懒加载模式的效果图,可以看到第一次切换需要加载数据,而第二次切回去则界面不会变化,效果和手机淘宝一样
定制baseapplication
定制baseapplication那就简单了,在application中经常用到的就是第三方的设置、数据库的加载,具体可以根据项目需求进行定制
public abstract class baseapplication extends application { public abstract void initconfigs(); @override public void oncreate() { super.oncreate(); initconfigs(); } }
结语
学习完之后,建议大家将basetemplate用到你们的项目中,当然从中也要学习抽象方法,抽取常用的方法,比如:在加载数据的时候可以抽取basecontroller,在adapter中可以抽取通用的baseadapter,具体还需要大家去研究。
源码下载:basetemplate
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
Android快速开发之定制BaseTemplate
-
Android UI设计与开发之ViewPager介绍和简单实现引导界面
-
分享Android开发自学笔记之AndroidStudio常用功能
-
Android UI设计与开发之PopupWindow仿腾讯新闻底部弹出菜单
-
Android开发之对话框案例详解(五种对话框)
-
Android编程开发之EditText中不输入特定字符会显示相关提示信息的方法
-
Android开发之如何自定义数字键盘详解
-
Android编程开发之TextView控件用法(2种方法)
-
Android开发之图片旋转功能实现方法【基于Matrix】
-
Android开发之项目模块化实践教程