Android技能杂谈——如何优雅的处理控件的点击事件
首先分享一个最佳实践:
大家开发复杂一些的Android应用的时候常常会写一个BaseActivity或者BaseFragment,里面写上一些基本而公用的方法,比如监听网络状况、弹出对话框、设置actionbar等,然后实现业务的Activity或者Fragment继承自这个基类。这样子可以大幅度的节省很多代码量,维护起来也很快速。
但是若界面上View很多,而且很多都要有click事件,那你是不是要写一堆setOnClick之类的代码呢?通过笔者的经验,有两种方式可以让你的ViewClick处理的代码更加优雅:
- 使用butterknife框架
- 在基类中做文章
前者不多说,大家可以多参考下butterknife的资料,这里着重介绍后者方式
问题引入(这里用Fragment举例)
如果你对某个view需要设置click事件,传统的代码是:
private TextView mPayment;
mPayment = (TextView) findViewById(R.id.payment);
mPayment.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//do something
}
});
你看为了处理一个view的点击事件,还没写具体点击事件做的事情就已经堆了这么多的代码。但是你有没有思考过,这个View是否要用到呢?是否需要findviewbyid出来呢?仅仅处理点击事件是否可以这样子写:
findViewById(R.id.payment).setOnClickListener(this); @Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.payment: break;
}
}
这里的onClick是整个Fragment要implements一个View.onClickListener后自动需要强制实现的,具体点击事件可以在里面做。
上面的代码能看到我实际上并没有获取一个mPayment这个TextView的实例,实际上我可能并不需要获得他因为后面我不会去改变他。这样子还有一个好处,就是减少了内存消耗,因为少了一个对象。
改造基类
如果需要添加的点击事件view很多了,那么这里就要写很多这样的代码了:
findViewById(R.id.payment).setOnClickListener(this);
由于都是重复代码,显然这些代码可以放到基类中,于是在基类这样子设计:
public abstract class BaseFragment extends Fragment implements View.OnClickListener{
public void setViewClickListener(ArrayList<Integer> viewIds, View rootView) {
for (int viewId : viewIds) {
rootView.findViewById(viewId).setOnClickListener(this);
}
}
}
这个方法传入一个以view的id为元素的list和一个停靠view即可
那么子类都继承自这个BaseFragment,具体写法是:
public class RootCashierFragment extends BaseFragment {
private ArrayList<Integer> viewIds = new ArrayList<>();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.root_layout_cashier, null);
viewIds.add(R.id.fab);
setViewClickListener(viewIds, view);
return view;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.payment:
L.d("click payment");
break;
}
}
}
这样子所有的view的click事件全部放在了onClick中,看起来很优雅不乱,维护起来也一目了然
如何维护
后期若是需要添加减少需要监听需要点击事件的view,那么只需要做两件事情:
- 在viewIds中add新(remove旧)的view的id
- 在onClick实现(删除)点击后具体的内容
Android技能杂谈——如何优雅的处理控件的点击事件的更多相关文章
- android中RecyclerView控件实现点击事件
RecyclerView控件实现点击事件跟ListView控件不同,并没有提供类似setOnItemClickListener()这样的注册监听器方法,而是需要自己给子项具体的注册点击事件. 本文的例 ...
- Android 使用代码主动去调用控件的点击事件(模拟人手去触摸控件)
使用代码主动去调用控件的点击事件(模拟人手去触摸控件) //View 可以是LinearLayout,Button,TextView View.performClick();
- 【MAUI】为 Label、Image 等控件添加点击事件
一.前言 已经习惯了 WPF.WinForm 中"万物皆可点击"的方式. 但是在 MAUI 中却不行了. 在 MAUI 中,点击.双击的效果,是需要通过"手势识别器&qu ...
- Android监听Button和ImageButton控件的点击事件
一.onClick事件 Button和ImageButton都有一个onClick事件,通过自身的.setOnClickListener(OnClickListener)方法添加点击事件 所有的控件都 ...
- Android简单的ListViewDemo及每个控件的点击事件
ListView是什么? ListView是一个 数据控件,可以展示从数据库中读取的数据.是.net3.5的新控件. 它比gridview更灵活,而且支持多种模板,支持分页. 文章地址 http:// ...
- Button控件的点击事件
Java的代码 主要重点: findViewById(); OnClickListener() package com.example.admin.myapplication; import andr ...
- 继承UIView的子控件添加点击事件
UITapGestureRecognizer*tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:selfaction:@select ...
- listview适配器中的控件的点击事件并传值
@Override public View getView(final int position, View convertView, ViewGroup parent) { // TODO Auto ...
- ios 给移动的控件添加点击事件
前言: 给一个UIView做移动动画,虽然看起来frame在持续改变,但是它的frame已经是最终值了. 也就是说表面看到的动画都是假象,它的真实位置已经是固定的了.所以只有点击在他的真实frame范 ...
随机推荐
- 关于PHP中Session文件过多的问题
PHP的默认机制:每一次php请求,会有1/100的概率(默认值)触发“session回收”.如果“session回收”发生,那就会检查/tmp/sess_*的文件,如果最后的修改时间到现在超过了14 ...
- FinanceJson
FinanceJson, 对Json的包装.底层使用jackson实现. 1. 生成节点 (1)在某个路径下添加某个节点 FinanceJson financeJsonInfo = FinanceJs ...
- P2P行业专业术语(最全)
网贷:P2P网络借款,指个体与个体之间通过网站实现借贷,中间网站称为网贷平台,简称平台. 角色类 投资者:在网站上把钱借出去的用户,年龄必须是18周岁以上具有中国国籍的公民. 借款者(贷款者):是指有 ...
- 【VB超简单入门】三、开始编程
接下来要进入正题了!同学们要认真看咯~ 第一步:安装VB开发IDE 在这里我推荐大家安装的是VB迷你版,现在大多数同学使用win7,这个版本可以在win7上运行的妥妥的~ 下载链接:http://pa ...
- 初识zookeeper(二)之与Dubbo-admin关联
1.简介:dubbo-admin,即dubbo管理控制台,管理控制台为内部裁剪版本,开源部分主要包含:路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡,等管理功能,主要是用于Dubbo服务的 ...
- 纯CSS3制作学生入学档案表单样式代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- [嵌入式开发板]iTOP-4412开发板linux 系统存储空间的修改
平台:iTOP-4412开发板 这里我们以修改成 1G 存储空间为例来讲解修改方法, 如果需要改 成其他大小的存储空间,参照此方法修改即可. 首先连接好 iTOP-4412 开发板的调试串口到 pc ...
- MVC+AjaxFileUpload文件上传
来源:微信公众号CodeL 本次给大家分享的是ajaxfileupload文件上传插件,百度一大堆功能超炫的文件上传插件,为什么我们会选择这个插件呢? 原因是在此之前,我们尝试使用过很多基于flash ...
- [转载]ExtJs4 笔记(7) Ext.tip.ToolTip 提示
作者:李盼(Lipan)出处:[Lipan] (http://www.cnblogs.com/lipan/)版权声明:本文的版权归作者与博客园共有.转载时须注明本文的详细链接,否则作者将保留追究其法律 ...
- codeforces 719E E. Sasha and Array(线段树)
题目链接: E. Sasha and Array time limit per test 5 seconds memory limit per test 256 megabytes input sta ...