本篇内容有:

定制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小时内与您取得联系。