全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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 ListView的Item点击效果的定制  # Android实现定制返回按钮动画效果的方法  # Android定制自己的EditText轻松改变底线颜色  # Android 组件样式定制方法详解  # Android实现定制桌面的方法  # android源码探索之定制android关机界面的方法  # Android实现的状态栏定制和修改方法  # Android 如何定制vibrator的各种震动模式M 具体方法  # Android定制RadioButton样式三种实现方法  # 详解android系统的定制  # 加载  # 的是  # 这段  # 的人  # 成了  # 让你  # 你是  # 那就  # 都要  # 也要  # 你在  # 很多人  # 你们的  # 很有  # 一切都  # 我把  # 这就  # 也很  # 很简单  # 更有 


相关文章: 如何通过FTP空间快速搭建安全高效网站?  如何做静态网页,sublimetext3.0制作静态网页?  番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?  建站主机核心功能解析:服务器选择与网站搭建流程指南  上海网站制作网站建设公司,建筑电工证网上查询系统入口?  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  相册网站制作软件,图片上的网址怎么复制?  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  昆明网站制作哪家好,昆明公租房申请网上登录入口?  百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?  用v-html解决Vue.js渲染中html标签不被解析的问题  建站之星免费模板:自助建站系统与智能响应式一键生成  如何配置支付宝与微信支付功能?  如何零基础开发自助建站系统?完整教程解析  建站之星2.7模板:企业网站建设与h5定制设计专题  网站制作壁纸教程视频,电脑壁纸网站?  微信小程序 input输入框控件详解及实例(多种示例)  如何在景安服务器上快速搭建个人网站?  网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?  如何在建站之星网店版论坛获取技术支持?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  昆明高端网站制作公司,昆明公租房申请网上登录入口?  网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  海南网站制作公司有哪些,海口网是哪家的?  javascript中的try catch异常捕获机制用法分析  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  如何基于PHP生成高效IDC网络公司建站源码?  如何彻底删除建站之星生成的Banner?  香港服务器租用每月最低只需15元?  高端云建站费用究竟需要多少预算?  如何设置并定期更换建站之星安全管理员密码?  如何获取上海专业网站定制建站电话?  宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  名字制作网站免费,所有小说网站的名字?  活动邀请函制作网站有哪些,活动邀请函文案?  潮流网站制作头像软件下载,适合母子的网名有哪些?  定制建站方案优化指南:企业官网开发与建站费用解析  如何在Tomcat中配置并部署网站项目?  C#如何在一个XML文件中查找并替换文本内容  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  如何快速搭建FTP站点实现文件共享?  如何配置IIS站点权限与局域网访问?  如何快速建站并高效导出源代码?  建站之星如何优化SEO以实现高效排名?  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  魔方云NAT建站如何实现端口转发?  如何在IIS中新建站点并配置端口与物理路径? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。