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. Java拓展教程:文件DES加解密

    Java拓展教程:文件加解密 Java中的加密解密技术 加密技术根据一般可以分为对称加密技术和非对称加密技术.对称加密技术属于传统的加密技术,它的加密和解密的密钥是相同的,它的优点是:运算速度快,加密 ...

  2. Ctags快速入门

    Ctags快速入门 在vim下阅读代码,特别是阅读不熟悉的代码时,ctags是一个提高效率的强大的工具. 1. ctags是什么? ctags可以将代码中的函数.方法.类.变量和其他的标识符进行索引, ...

  3. 和菜鸟一起学android4.0.3源码之硬件gps简单移植【转】

    本文转载自:http://blog.csdn.net/mwj19890829/article/details/18751447 关于Android定位方式 android 定位一般有四种方法,这四种方 ...

  4. Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals)

    题目链接:http://codeforces.com/contest/828 A. Restaurant Tables time limit per test 1 second memory limi ...

  5. NOIP 2016【蚯蚓】

    好吧,我承认我是个智障-- 这道题一眼看上去就是个堆,然而实际上有单调性. 注意到,如果 \(q = 0\) 的话,将蚯蚓的左右两边分开丢进两个队列中,则两个队列都是单调不增的,因为每次取出的蚯蚓长度 ...

  6. C#SocketAsyncEventArgs实现高效能多并发TCPSocket通信 (服务器实现)

    http://freshflower.iteye.com/blog/2285272 想着当初到处找不到相关资料来实现.net的Socket通信的痛苦与心酸, 于是将自己写的代码公布给大家, 让大家少走 ...

  7. selenium 经常用到的API

    一.webdriver 属性及方法: 1.获取当前页面的 url driver.current_url 2 .获取窗口相关信息 get_window_position() 返回窗口x,y坐标 get_ ...

  8. laravel登录后台500错误!

    登录页面正常显示,填写完用户名密码 点登录后 页面一片空白,没有任何输出.debug可以看到一个500错误,preview和response都是空的.追踪了一下 发现在public/index.php ...

  9. sed 中带变量的情况

    #teststr="IBM" #sed -n '/' "$teststr" '/=' testfile.txt 在sed中使用变量 通常,我们使用sed进行变量 ...

  10. HihoCoder1650 : 扁平化管理([Offer收割]编程练习赛38)(二分)

    描述 小Hi的公司包括CEO在内一共有N名员工.这N名员工的上下级关系形成树形结构,CEO处于树根,普通员工处于叶子节点. 现在公司希望管理扁平化,要求树形结构中的层级不超过L层.此外,假设A是B的直 ...