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. Machine Learning No.4: Regularization

    1. Underfit = High bias Overfit = High varience 2. Addressing overfitting: (1) reduce number of feat ...

  2. 3D焦点图插件

    在线演示 本地下载

  3. Android WiFi系统【转】

    本文转载自:http://blog.csdn.net/gabbzang/article/details/10584587 一.wpa_supplicant是什么? wpa_supplicant本是开源 ...

  4. Linux bash shell环境变量以及语法规范

    摘自: http://blog.csdn.net/abc_ii/article/details/8762739

  5. html5--1.15 style元素与HTML样式基础

    html5--1.15 style元素与HTML样式基础 学习要点: 1.引入样式的三种方式2.了解style元素插入内联样式表与内部样式表 1.引入样式的三种方式 1.外部样式表:通过 link元素 ...

  6. bzoj 3685

    线段树 方法一: 值域线段树,递归去写的,每次节点存出现次数. 对于几个操作, 1,2 直接加减就好 ; 3,4 操作贪心往某一个方向找 .7也很简单,主要说前驱后继怎么找.我是先找这个数第几小,根据 ...

  7. java面试题07

    1.重载和重写的区别? 重载(Overload):(1)方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型.重载Overloading是一个类中多态性 ...

  8. 百度之星2017初赛A

    雪崩,没晋级,补题 1001 分析:求n-1的约数个数 #include "iostream" #include "cstdio" #include " ...

  9. poj1325机器工作——二分图最小点覆盖

    题目:http://poj.org/problem?id=1325 二分图求最大匹配,即为最小点覆盖: 一开始我写得较麻烦,求出最大匹配又去搜增广路,打标记求最小点覆盖: 然而两种方法都没写“ans= ...

  10. 一般项目转为Maven项目所遇到的问题

    最近搞CI,准备使用Maven,但以前的项目不是Maven项目,需要把项目转换为Maven项目.这遇到几个小问题,一是jar包的依赖,二是从本地仓库取出依赖jar包. 由于没有本地仓库,要手动添加ja ...