首先分享一个最佳实践:

大家开发复杂一些的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. Group By Count不能显示0的问题

    问题: 如对表: /*==================================================== id |score |grade ------------------- ...

  2. 一次简单的MySQL数据库导入备份

    任务目的:把现网数据库(MySQL5.5,windows)中的内容导入到测试数据库(MySQL5.1,linux)中 1.由于对MySQL并不熟悉,一上来我先考虑方案是用现成的数据库管理工具来处理.我 ...

  3. hdu 1561 The more, The Better(树形dp,基础)

    The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  4. java poi read write xlsx

    package myjava; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExce ...

  5. uva 816 abbott's revenge ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAncAAAN5CAYAAABqtx2mAAAgAElEQVR4nOy9sY4jydKezVuoayhH0r

  6. LeetCode题解-----Maximum Gap

    题目描述: Given an unsorted array, find the maximum difference between the successive elements in its so ...

  7. 如何利用ZBrush中的DynaMesh创建身体(一)

    之前的ZBrush教程中我们用Extract抽出功能演示了头发的立体雕刻方法,本讲将对已完成的头部模型添加躯干,使用DynaMesh创建身体的方法,以及人体比例和结构的介绍. 查看详细的视频教程可直接 ...

  8. Android代码优化----PullToRefresh+universal-image-loader实现从网络获取数据并刷新

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  9. oracle wm_concat(column)函数的使用

    oracle wm_concat(column)函数使我们经常会使用到的,下面就教您如何使用oraclewm_concat(column)函数实现字段合并,如果您对oracle wm_concat(c ...

  10. java 21 - 1 IO流中的字符流概述

    字节流通过读取一个byte数组的方式可以读取中文的,但是有可能出现小问题,所以,读取中文最好是用字符流. 字符流: 字符流=字节流+编码表. 编码表: 由字符及其对应的数值组成的一张表 编码表介绍: ...