首先分享一个最佳实践:

大家开发复杂一些的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,那么只需要做两件事情:

  1. 在viewIds中add新(remove旧)的view的id
  2. 在onClick实现(删除)点击后具体的内容

Android技能杂谈——如何优雅的处理控件的点击事件的更多相关文章

  1. android中RecyclerView控件实现点击事件

    RecyclerView控件实现点击事件跟ListView控件不同,并没有提供类似setOnItemClickListener()这样的注册监听器方法,而是需要自己给子项具体的注册点击事件. 本文的例 ...

  2. Android 使用代码主动去调用控件的点击事件(模拟人手去触摸控件)

    使用代码主动去调用控件的点击事件(模拟人手去触摸控件) //View 可以是LinearLayout,Button,TextView View.performClick();

  3. 【MAUI】为 Label、Image 等控件添加点击事件

    一.前言 已经习惯了 WPF.WinForm 中"万物皆可点击"的方式. 但是在 MAUI 中却不行了. 在 MAUI 中,点击.双击的效果,是需要通过"手势识别器&qu ...

  4. Android监听Button和ImageButton控件的点击事件

    一.onClick事件 Button和ImageButton都有一个onClick事件,通过自身的.setOnClickListener(OnClickListener)方法添加点击事件 所有的控件都 ...

  5. Android简单的ListViewDemo及每个控件的点击事件

    ListView是什么? ListView是一个 数据控件,可以展示从数据库中读取的数据.是.net3.5的新控件. 它比gridview更灵活,而且支持多种模板,支持分页. 文章地址 http:// ...

  6. Button控件的点击事件

    Java的代码 主要重点: findViewById(); OnClickListener() package com.example.admin.myapplication; import andr ...

  7. 继承UIView的子控件添加点击事件

    UITapGestureRecognizer*tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:selfaction:@select ...

  8. listview适配器中的控件的点击事件并传值

    @Override public View getView(final int position, View convertView, ViewGroup parent) { // TODO Auto ...

  9. ios 给移动的控件添加点击事件

    前言: 给一个UIView做移动动画,虽然看起来frame在持续改变,但是它的frame已经是最终值了. 也就是说表面看到的动画都是假象,它的真实位置已经是固定的了.所以只有点击在他的真实frame范 ...

随机推荐

  1. Effective Java 27 Favor generic methods

    Static utility methods are particularly good candidates for generification. The type parameter list, ...

  2. Effective Java 44 Write doc comments for all exposed API elements

    Principle You must precede every exported class, interface, constructor, method, and field declarati ...

  3. java打字游戏

    小记:老早之前写的程序,今天发现之前在 csdn上写的东西的图片不显示了,搞得人好郁闷,所以把之前零星的几篇文章搬个家 游戏运行截图: 字母实体类 package com.git.game; impo ...

  4. 利用mysql对特殊字符和超长字符会进行截断的特性 进行存储型XSS攻击——WordPress <4.1.2 & <=4.2 存储型xss

    转自:Baidu Security LabXteam http://xteam.baidu.com/?p=177 漏洞概述 本次漏洞出现两个使用不同方式截断来实现的存储型xss,一种为特殊字符截断,一 ...

  5. saltstack通过salt.client执行命令(转)

    利用saltstack的salt.client模块可以在python的命令行下或者python脚本里执行相应的salt命令 master端想要执行类似 salt '*' cmd.run 'uptime ...

  6. MyCat 学习笔记 第七篇.数据分片 之 按数据范围分片

    1 应用场景 Mycat 其实自带了2个数据范围分片的方案,一个是纯数据范围的分片,比如 1至 10000 号的数据放到分片1 ,10001 至 20000号数据放到分片2里. 另一个是数据常量形式的 ...

  7. memcpy函数

    实现1:<高质量c++,c编程指南> void *mymemcpy(void *dst,const void *src,size_t num) { assert((dst!=NULL)&a ...

  8. WDK编程的一些特殊点

    函数的多线程安全性在内核编程中比用户态应用程序的编程更常见. 调用源 运行环境 原因 driverEntry,DriverUnload 单线程 这两个函数由系统进程的单一线程调用,不会出现多线程同时调 ...

  9. Hadoop 分布式文件系统 - HDFS

    当数据集超过一个单独的物理计算机的存储能力时,便有必要将它分不到多个独立的计算机上.管理着跨计算机网络存储的文件系统称为分布式文件系统.Hadoop 的分布式文件系统称为 HDFS,它 是为 以流式数 ...

  10. HDU 1695 GCD (莫比乌斯反演)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...