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

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

时间: 2024-10-26 12:33:57

Android快速开发之定制BaseTemplate的相关文章

Android快速开发系列 10个常用工具类

目录(?)[+] 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38965311,本文出自[张鸿洋的博客] 打开大家手上的项目,基本都会有一大批的辅助类,今天特此整理出10个基本每个项目中都会使用的工具类,用于快速开发~~ 在此感谢群里给我发项目中工具类的兄弟/姐妹~ 1.日志工具类L.java [java] view plaincopy package com.zhy.utils;      import android.u

实例详解Android快速开发工具类总结_Android

一.日志工具类 Log.java public class L { private L() { /* 不可被实例化 */ throw new UnsupportedOperationException("Cannot be instantiated!"); } // 是否需要打印bug,可以在application的onCreate函数里面初始化 public static boolean isDebug = true; private static final String TAG

实例详解Android快速开发工具类总结

一.日志工具类 Log.java public class L { private L() { /* 不可被实例化 */ throw new UnsupportedOperationException("Cannot be instantiated!"); } // 是否需要打印bug,可以在application的onCreate函数里面初始化 public static boolean isDebug = true; private static final String TAG

android 快速开发框架,基于组件化的MVP结构

AndroidMouldProject2 android快速开发模板工程,组件化的MVP结构,方便快速开发和多人协作,减少代码耦合,同时方便自定义扩展,封装了一些常用 的模块,通过引用AndroidBaseModule基础工程的方式来实现持续更新,同时通过依赖库的方式,增强个性化定制,使工程更加 简洁,使开发者只需要关心自己的逻辑实现,便于维护. 项目结构: 使用方法: 复制代码,修改包名,按照自己的需求更改代码逻辑和依赖关系 新建activity,fragment,model,view,pre

国外有哪些软件定制开发平台(或者软件快速开发平台)?

问题描述 这里提问的不是软件开发平台(不包含VisualStudio这类开发工具),而是客户化的软件定制开发平台.所谓客户化,就是由用户自己来实现的,一般不需要编写程序代码,而只进行简单的拖拽或配置.这种平台一般都是框架开发平台,能解决居多企业管理系统这类软件的危机.在我国,这种快速开发平台也有一些,做得好的并不多见,例如:ExceServer,普元EOS,方正FIX,顶点LIVEBOS,UCML,金富瑞等.有没有朋友可以给我提供一点基于框架的软件开发平台.软件快速开发平台.软件在线开发平台等等

Android app 用appBase快速开发购物车实例教程

appBase基础介绍 appBase是什么? appBase是一个Android app开发的基础集合,目的是任何应用都可以在这个基础之上开发app,省去了搭建框架的时间. appBase=xutils+fastjson+avlib     xutils使用了其中HttpUtils.BitmapUtils.DbUtils    fastjson使用了json解析    avlib大家比较陌生,这个库是我另外一个简单的工具库.主要功能是View的自动绑定.View的常用数据自动绑定.万能Adap

巧用第三方快速开发Android App 热门第三方SDK及框架

巧用第三方快速开发Android App 热门第三方SDK及框架 历经大半年的时间,终于是把这门课程给录制出来了,也就在今天,正式在慕课网上上线了 项目地址:巧用第三方快速开发Android App 热门第三方SDK及框架 这这篇博客也是专门来聊聊这门课程有什么不一样,首先,这门课程是比较针对于快速学习,快速上手的同学的,所以这是面向参加工作或者准备参加工作的同学所迫切需要的,因为只有你掌握了这些,对于你实际开发中才是有帮助的,当然,你要是还在校,那也没关系的,学习本身就是一法通万法,但是你们却

《Android应用开发从入门到精通》——第1章,第1.2节Android架构解析

1.2 Android架构解析 Android应用开发从入门到精通 Android系统的底层建立在Linux系统之上,该平台采用一种称为软件叠层(Software Stack)的方式进行构建.这种软件叠层结构使得层与层之间相互分离,明确各层的分工.这种分工是软件工程中常说的低耦合高内聚的设计概念. 1.2.1 Android系统架构图 Android作为一个移动设备的平台,其软件层次结构包括了内核层.中间件和应用程序.下面看看Android的系统架构图,如图1.2所示. 如图1.2所示,Andr

Android ROM开发(二)——ROM架构以及Updater-Script脚本分析,常见的Status错误解决办法

Android ROM开发(二)--ROM架构以及Updater-Script脚本分析,常见的Status错误解决办法 怪自己二了,写好的不小心弄没了,现在只好重新写一些了,上篇简单的配置了一下环境,这里呢,就来讲一下相关的只是点 我们先下载一个ROM,随便下,原理都是差不多的,这里我就下载一个红米Note的MIUI稳定版 1.ROM结构 ROM根据厂商的定制可能有所不同,但是大体是不变的 data 内置一些软件 META-INF 脚本文件 update-binary 二进制文件 updater