Android实现监听控件点击事件

引言

这篇文章主要想写一下Android实现监听点击事件的几种方法,Activity和Fragment实现起来有些方法上会有些不同,这里也略做介绍。

最近一直在忙一个项目,深感掌握监听事件的重要性,同时也要综合运用实现监听的几种方法,在编写代码的时候正确选择,既能减少代码量,代码的可读性也会更高。

总结

1、通过匿名内部类实现监听

2、直接实现监听接口实现监听

3、自定义内部类实现接口实现监听

一些我想说的:

1、所有的控件都可以注册监听来实现点击后执行某项操作,这并不是只有Button这类的组件特有的功能。

2、 一般来说每个控件使用上面的第一种方法--使用匿名内部类的形式都是类似下面这种:

Button mButton;

mButton=(Button)findViewById(R.id.xx);

mButton.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
//这里执行具体点击后的操作 }
});

但并不是每一个组件的实现方式都是上面这种,这里我举两个例子给大家参考:

(1)、ListView利用匿名内部类实现监听

ListView mListView=(ListView)findViewById(R.id.xx);

mListView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent,View view,int position,long id){
//这里执行具体操作 }
});

(2)、RecyclerView利用匿名内部类实现监听

//定义ViewHolder内部类
private class xxxx extends RecyclerView.ViewHolder { public xxxx(LayoutInflater inflater,ViewGroup parent){
super(inflater.inflate(R.layout.list_item,parent,false));
itemView.setOnClickListener(new RecyclerView.OnClickListener(){ @Override
public void onClick(View v) {
Toast.makeText(getActivity(),"点击按钮", Toast.LENGTH_LONG).show();
}
});
}
}

在这点上面RecyclerView还是更高级一些,内部实现的这个itemView为我们节省了很多工夫,也隐去了很多细节。

举这两个例子也是希望大家能正确使用匿名内部类为控件注册监听。

3、在Fragment的写法略有区别,这点大家要注意,这里将上面那个Button的修改为在Fragment中

Button mButton;

mButton=(Button)View.findViewById(R.id.xx);

mButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
//这里执行具体点击后的操作 }
});

只是在findViewById()方法前也要记得加View,还有一些是加getActivity()方法的,Fragment的编程很实用,还是需要好好掌握。

像上面这样特殊的大家可以多积累,有点印象知道怎么用就行。

好了,下面详细看看上面的三种方法:

1、通过匿名内部类实现监听

这里和上面的代码有些重复,大家参考一下就好。

public class MainActivity extends AppCompatActivity {

    private Button login;

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); login = (Button) findViewById(R.id.login); login.setOnClickListener(new View.OnClickListener(){ @Override
public void onClick(View v) { Toast.makeText(MainActivity.this,"点击登录",Toast.LENGTH_SHORT).show(); }
});
}
}

上面的代码Toast后面的show()一定要记得写,我自己也经常犯这样的错误,调试半天才发现是这个没写。

2、直接实现接口实现监听

这后面两种都比较容易理解,这里我直接给出代码:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button mButton=(Button)findViewById(R.id.create_database);
mButton.setOnClickListener(this);
} @Override
public void onClick(View v) {
switch (v.getId()){
case R.id.create_database:
//执行具体操作
break; default:
break;
}
}
}

3、自定义内部类实现接口实现监听

代码如下:

public class MainActivity extends AppCompatActivity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button mButton=(Button)findViewById(R.id.create_database);
mButton.setOnClickListener(new MyButtonListener());
} class MyButtonListener implements View.OnClickListener{ @Override
public void onClick(View v) {
switch (v.getId()){
case R.id.create_database:
//执行具体操作
break; default:
break;
}
}
}
}

当然,这里也可以不用内部类来实现,新建一个类来继承View.OnClickListener接口也是可以的,不过我并不建议这种做法,这样写还不如直接在本类中继承接口。

我的一些看法:

这上面的三种方法实际上就是一种方法,只是通过不同方式来实现继承View.OnClickListener接口,看个人习惯,掌握了类的继承这三种方法都好理解。

就我个人的建议,当需要注册监听事件的控件较少时,使用匿名内部类得到方法会直观便捷一些,当这类的控件较多时,利用第二或者第三种会好一些,毕竟不用每一个去重写 onClick() 方法。

总结:

这上面和大家分享了一下 Android 实现注册监听的几种方法,也分享了一下我自己的看法,实质还是接口的继承,好好理解类的继承相信这上面的完全不是问题。

在实现上也要注意 Activity 和 Fragment 的区别,不行就在方法前加一个 View 或者getActivity() 之类的,多积累 Fragment 在界面编辑上还是很实用的。

注:本文是Android基于MVC设计模式。

这里大家可以考虑一个问题,在按钮控件很少的情况下我们可以在代码中通过注册监听的情况实现监听点击,但在实际中的Android项目都是十分庞大的,特别像手机游戏这类的,利用这类方法去实现显然时很吃力的,显然 MVC 设计模式也并不适用。

MVVM设计模式,实质上就是 MVC的改进版,MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开,这也使得我们能直接在 XML 文件中直接操作控件点击事件,当然代码的编写就不是上面那样的,大家有兴趣的可以再自行上网查阅资料。

接触Android不多,是个菜鸟,上面有错误的地方还请大家指正,希望能和大家多交流。

本文系原创,转载还请注明出处。

Android实现监听控件点击事件的更多相关文章

  1. 使用WTL的消息反射封装CEdit实现监听控件文本改变事件

    消息反射机制可以使对消息的处理都集中在控件类中,以CEdit的EN_CHANGE消息为例: /*MyEdit.h*/ class CMyEdit:public CWindowImpl<CMyEd ...

  2. iOS 监听控件某个属性的改变observeValueForKeyPath

    创建一个测试的UIButton #import "ViewController.h" @interface ViewController () @property(nonatomi ...

  3. Android监听消息通知栏点击事件

    Android监听消息通知栏点击事件 使用BroadCastReceiver 1 新建一个NotificationClickReceiver 类,并且在清单文件中注册!! public class N ...

  4. 监听tableview的点击事件

    // 监听tablview的点击事件 - (void)addAGesutreRecognizerForYourView { UITapGestureRecognizer *tapGesture = [ ...

  5. highcharts图表组件入门教程:如何监听柱状图柱子点击事件动态更新当前数据点数值和所对应X轴刻度

    highcharts图表组件入门教程:如何监听柱状图柱子点击事件动态更新当前数据点数值和所对应X轴刻度 作者:highcharts | 时间:2014-6-11 14:07:05 | [小  大] | ...

  6. winform自定义控件中其他遮挡控件点击事件

    自定义控件在其他窗口调用时,里面的lable阻挡了控件的点击事件 解决方法 自定义控件中lable的 点击事件 private void Lable1_Click(object sender, Eve ...

  7. iOS全埋点解决方案-控件点击事件

    前言 ​ 我们主要介绍如何实现控件点击事件($AppClick)的全埋点.在介绍如何实现之前,我们需要先了解一下,在 UIKit 框架下,处理点击或拖动事件的 Target-Action 设计模式. ...

  8. Android 监听按钮的点击事件

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

  9. Android 使用 OnTouchListener 接口监听双击或多击事件

    这里是使用 OnTouchListener 实现的监听双击 or 多击的监听器.通过 View.setOnTouchListener ,可以实现在任意 View 上监听双击事件. 网上有许多文章简单的 ...

随机推荐

  1. Spring Boot2.0之 jar打包方式

    Jar类型打包方式 1.使用mvn celan  package 打包 2.使用java –jar 包名 war类型打包方式 1.使用mvn celan package 打包 2.使用java –ja ...

  2. 51nod 80分算法题

    1537:见前几篇. 1627:题意:给定n,m的网格(10^5),初始状态为(1,1),你每次可以瞬移到右下方(不可以同行同列逗留)任何一个方格里,求移动到n,m的方案数. 一句话题解:首先很容易想 ...

  3. zabbix 监控 haproxy 记录

    1. 当配置好后,遇到 Value should be a JSON object. 该如何是好? sudo 文件增加: zabbix ALL=(ALL) NOPASSWD: ALL haproxy ...

  4. c语言字符串 数字转换函数大全

    最近学数据结构老是做实验 常用到字符串和数字的转换 想找却发现网上的资料太散 所以搜集整理一下 方便以后再用 atof(将字符串转换成浮点型数) atoi(将字符串转换成整型数) atol(将字符串转 ...

  5. tflearn 在每一个epoch完毕保存模型

    关键代码:tflearn.DNN(net, checkpoint_path='model_resnet_cifar10', max_checkpoints=10, tensorboard_verbos ...

  6. deep QA 基于生成的chatbot系统

    deep QA: https://github.com/Conchylicultor/DeepQA  基于论文:https://arxiv.org/pdf/1506.05869.pdf  基于生成的c ...

  7. MySQL如何计算动销率_20161025

    动销率一般反映在采购管理上,它的公式为:商品动销率=(动销品种数 /仓库总品种数)*100% . 也可以理解为销售的商品数量和仓库库存的商品数量,假如你仓库里有100个品种,在上月销售了50种,动销率 ...

  8. 数据库小记:根据指定名称查询数据库表名及根据指定名称查询数据库所有表中的字段名称(支持mysql/postgre)

    意:本篇文章仅适用于mysql和postgre这两种数据库 1.查询数据库中所有表名及对应表的详细信息 select * from INFORMATION_SCHEMA.tables 2.根据指定名称 ...

  9. poj2182Lost Cows——树状数组快速查找

    题目:http://poj.org/problem?id=2182 从后往前确定,自己位置之前没有被确定的且比自己编号小的个数+1即为自己的编号: 利用树状数组快速查找,可另外开一个b数组,角标为编号 ...

  10. python使用uuid生成唯一id或str

    介绍: UUID是128位的全局唯一标识符,通常由32字节的字符串表示. 使用: import uuid print uuid.uuid1() 14bfe806-f1c7-11e6-83b5-0680 ...