当前位置: 移动技术网 > IT编程>移动开发>Android > Android快速开发之定制BaseTemplate

Android快速开发之定制BaseTemplate

2019年07月24日  | 移动技术网IT编程  | 我要评论

热血无赖飞膝击晕,零时零分爱上你,清朝张怀远

本篇内容有:

定制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,具体还需要大家去研究。

源码下载:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网