Android监听事件的回调机制
2016-05-15 14:38
513 查看
最近做项目的时候遇到了自定义弹框中输入的值无法返回的问题,需要用到回调,于是就上网查阅了许多资料,以下是本人对回调的理解,希望能够帮助有需要的朋友:
先举个生活中常见的例子:
A有一个问题要问B,B说:“把你的手机号码给我吧,然后你手机随时开机着,等会儿我回去查到结果了就打你手机”,当B查到了结果,就会马上打回A的手机号码,A就收到了结果。这就是一个完整的回调过程。
然后再看看Android中的按钮监听事件onclicklistener
一般我们的做法都是如下:
其实,这里的MainActivity类就相当于我们前面那个例子中的提问者A,MainActivity中的按钮b就相当于A的手机号码,b.setOnClickListener(...)是为按钮b注册监听事件,相当于将联系方式告诉B(上面例子中的帮助解决问题的人)
在Android中触摸按钮点击事件是由Android系统调用的,Button继承链的顶端是View类,当用户触碰屏幕上的按钮时,就相当于B想到了解决问题的方法,即触发了View中封装好的onClick(),系统便会反过来调用用户重写的onClick()方法,这里的onClick就是我们所说的回调方法。
可能看了以上解释你还是有点模糊,我们再举个自定义Button的例子来说明这个过程:
首先为我们自定义的按钮建立一个监听接口:
自定义Button类:
用户调用:
在上面的过程中分为以下几步:
1.为按钮setMyOnClickListener注册监听,将括号里面的(new MyOnClickListener(){....})作为参数传给MyButton
2.由于MyButton中有一个setMyOnClickListener方法,通过this.listener = listener;可以将第一步传进来的MyOnClickListener对象赋给其成员变量
3.用户点击屏幕,触发系统底层的doClick函数
4.在doClick函数中listener.myOnClick()中,由第二步我们已知listener已被赋予成用户传进来的具体实现,所以此时的listener.myOnClick所调用的方法就是用户传进来的listener中重写的myOnClick方法,到这里也就是相当于反过来调用回用户所重写的myOnClick(),这里的myOnClick也就是我们常说的回调方法。
在上面这个例子的基础上,我们再通过加入一个字符串来加深回调的理解:
在原来的基础上,给监听接口中的方法加入一个参数:
在doClick方法中写入一个字符串:
在重写点击方法那里进行打印:
打印结果:
可以看到,s正是MyButton中传回来的那个字符串!这正好证明了系统调用点击方法时会反过来调用回我们所重写的myOnClick方法
总结:看完以上,还要强调一点:回调函数不是我们主动地去调用onClick方法,而是在某个时刻触发系统,让系统反过来调用我们所实现的onClick方法!其实Android中还有很多地方需要用到回调机制,比如Activity生命周期的各个函数、Handler机制中的收发消息等等,有兴趣的朋友也可以去研究一下相关代码。
先举个生活中常见的例子:
A有一个问题要问B,B说:“把你的手机号码给我吧,然后你手机随时开机着,等会儿我回去查到结果了就打你手机”,当B查到了结果,就会马上打回A的手机号码,A就收到了结果。这就是一个完整的回调过程。
然后再看看Android中的按钮监听事件onclicklistener
一般我们的做法都是如下:
Button b = (Button)this.findViewById(R.id.mybtn); b.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v){ Toast.makeText(MainActivity.this,"按钮被点击",1000).show(); } });
其实,这里的MainActivity类就相当于我们前面那个例子中的提问者A,MainActivity中的按钮b就相当于A的手机号码,b.setOnClickListener(...)是为按钮b注册监听事件,相当于将联系方式告诉B(上面例子中的帮助解决问题的人)
在Android中触摸按钮点击事件是由Android系统调用的,Button继承链的顶端是View类,当用户触碰屏幕上的按钮时,就相当于B想到了解决问题的方法,即触发了View中封装好的onClick(),系统便会反过来调用用户重写的onClick()方法,这里的onClick就是我们所说的回调方法。
可能看了以上解释你还是有点模糊,我们再举个自定义Button的例子来说明这个过程:
首先为我们自定义的按钮建立一个监听接口:
public interface MyOnClickListener{ //这个方法就相当于我们平时写button实现监听事件时所重写的onClick()方法,留给用户重写 public void myOnClick(); }
自定义Button类:
public class MyButton { private MyOnClickListener listener; public MyButton(Context context){ } //注册监听事件 public void setMyOnClickListener(MyOnClickListener listener) { this.listener = listener; } //模拟用户触摸屏幕时系统底层进行的操作 public void doClick(){ listener.myOnClick(); } }
用户调用:
MyButton b = new MyButton(this); //注册监听事件 b.setMyOnClickListener(new MyOnClickListener() { //这个就是回调函数 @Override public void myOnClick() { // TODO Auto-generated method stub //在此处由用户自行重写,当用户点击屏幕时,会触发系统去调用doClick方法 Toast.makeText(SecondActivity.this, "自定义的按钮被点击", 1000).show(); } }); //模拟用户触摸屏幕的行为,调用系统处理点击的方法 b.doClick();
在上面的过程中分为以下几步:
1.为按钮setMyOnClickListener注册监听,将括号里面的(new MyOnClickListener(){....})作为参数传给MyButton
2.由于MyButton中有一个setMyOnClickListener方法,通过this.listener = listener;可以将第一步传进来的MyOnClickListener对象赋给其成员变量
3.用户点击屏幕,触发系统底层的doClick函数
4.在doClick函数中listener.myOnClick()中,由第二步我们已知listener已被赋予成用户传进来的具体实现,所以此时的listener.myOnClick所调用的方法就是用户传进来的listener中重写的myOnClick方法,到这里也就是相当于反过来调用回用户所重写的myOnClick(),这里的myOnClick也就是我们常说的回调方法。
在上面这个例子的基础上,我们再通过加入一个字符串来加深回调的理解:
在原来的基础上,给监听接口中的方法加入一个参数:
public interface MyOnClickListener{ public void myOnClick(String s); }
在doClick方法中写入一个字符串:
public void doClick(){ listener.myOnClick("回调字符串..."); }
在重写点击方法那里进行打印:
MyButton b = new MyButton(); b.setMyOnClickListener(new MyOnClickListener() { @Override public void myOnClick(String s) { // TODO Auto-generated method stub //这里的s就会是刚才我们传进去的那个字符串 Log.d("LayoutInflater---->", ""+s); } });
打印结果:
可以看到,s正是MyButton中传回来的那个字符串!这正好证明了系统调用点击方法时会反过来调用回我们所重写的myOnClick方法
总结:看完以上,还要强调一点:回调函数不是我们主动地去调用onClick方法,而是在某个时刻触发系统,让系统反过来调用我们所实现的onClick方法!其实Android中还有很多地方需要用到回调机制,比如Activity生命周期的各个函数、Handler机制中的收发消息等等,有兴趣的朋友也可以去研究一下相关代码。
相关文章推荐
- Error:Cause: failed to find target : Open Android SDK Manager和SDK对应的API
- [经验技巧] Android移植中部分重要lib库文件作用
- android中的广播
- Android中XML的三种解析方式
- Android欢迎界面动画与跳转
- android开发笔记之 国家/地区语言速查表
- 解决BaseAdapter中多布局convertView复用加载错误
- 在Android上用Canvas绘制音频波形图
- Android studio怎样添加assets文件
- Android 仿JD浏览商品。滑动头部隐藏显示
- Android学习第十一周_gradle、NDK和依赖
- android开发笔记之 Android 国际化
- Android FragmentManage FragmentTransaction介绍
- QEMU KVM 虚拟机移植之性能提高篇小结(android 虚拟机双系统方案)
- android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context re
- android获取状态栏高度
- Spinner与Adapter
- Android存储(读取)之SharedPerference(最常用)
- Android Studio引入ButterKnife 8.0.1版本
- android开发笔记之多媒体—振动器(Vibrator)