Android监听事件的回调机制



 



 



最近做项目的时候遇到了自定义弹框中输入的值无法返回的问题,需要用到回调,于是就上网查阅了许多资料,以下是本人对回调的理解,希望能够帮助有需要的朋友:


先举个生活中常见的例子:
A有一个问题要问B,B说:“把你的手机号码给我吧,然后你手机随时开机着,等会儿我回去查到结果了就打你手机”,当B查到了结果,就会马上打回A的手机号码,A就收到了结果。这就是一个完整的回调过程。


然后再看看Android中的按钮监听事件onclicklistener

一般我们的做法都是如下:


1. Button b = (Button)this.findViewById(R.id.mybtn);  
2. b.setOnClickListener(new OnClickListener(){  
3. @Override  
4. public void onClick(View v){  
5. this,"按钮被点击",1000).show();  
6.     }  
7. });



其实,这里的MainActivity类就相当于我们前面那个例子中的提问者A,MainActivity中的按钮b就相当于A的手机号码,b.setOnClickListener(...)是为按钮b注册监听事件,相当于将联系方式告诉B(上面例子中的帮助解决问题的人)


在Android中触摸按钮点击事件是由Android系统调用的,Button继承链的顶端是View类,当用户触碰屏幕上的按钮时,就相当于B想到了解决问题的方法,即触发了View中封装好的onClick(),系统便会反过来调用用户重写的onClick()方法,

这里的onClick就是我们所说的回调方法


 

 

 

可能看了以上解释你还是有点模糊,我们再举个自定义Button的例子来说明这个过程:
首先为我们自定义的按钮建立一个监听接口:

 


1. public interface MyOnClickListener{  
2. //这个方法就相当于我们平时写button实现监听事件时所重写的onClick()方法,留给用户重写  
3. public void myOnClick();  
4. }





 

自定义Button类:

 





1. public class MyButton {  
2.       
3. private MyOnClickListener listener;  
4.       
5. public MyButton(Context context){  
6.           
7.     }  
8.       
9. //注册监听事件  
10. public void setMyOnClickListener(MyOnClickListener listener) {  
11. this.listener = listener;  
12.     }  
13.       
14. //模拟用户触摸屏幕时系统底层进行的操作  
15. public void doClick(){  
16.         listener.myOnClick();  
17.     }  
18.       
19.   
20. }




 

用户调用:

    1. MyButton b = new MyButton(this);  
    2. //注册监听事件  
    3. b.setMyOnClickListener(new MyOnClickListener() {  
    4. //这个就是回调函数  
    5. @Override  
    6. public void myOnClick() {  
    7. // TODO Auto-generated method stub  
    8. //在此处由用户自行重写,当用户点击屏幕时,会触发系统去调用doClick方法  
    9. this, "自定义的按钮被点击", 1000).show();  
    10.     }  
    11. });  
    12. //模拟用户触摸屏幕的行为,调用系统处理点击的方法  
    13. 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也就是我们常说的回调方法。

     

     

     

    在上面这个例子的基础上,我们再通过加入一个字符串来加深回调的理解:
    在原来的基础上,给监听接口中的方法加入一个参数:

     




    1. public interface MyOnClickListener{  
    2. public void myOnClick(String s);  
    3. }



     

     

     

    在doClick方法中写入一个字符串:

     





    1. public void doClick(){  
    2. "回调字符串...");  
    3. }




     

     

    在重写点击方法那里进行打印:

     





    1. MyButton b = new MyButton();  
    2. b.setMyOnClickListener(new MyOnClickListener() {  
    3. @Override  
    4. public void myOnClick(String s) {  
    5. // TODO Auto-generated method stub  
    6. //这里的s就会是刚才我们传进去的那个字符串  
    7. "LayoutInflater---->", ""+s);  
    8.     }  
    9. });




     

     

    打印结果:



    转载于:

    最近做项目的时候遇到了自定义弹框中输入的值无法返回的问题,需要用到回调,于是就上网查阅了许多资料,以下是本人对回调的理解,希望能够帮助有需要的朋友:



    先举个生活中常见的例子:


    A有一个问题要问B,B说:“把你的手机号码给我吧,然后你手机随时开机着,等会儿我回去查到结果了就打你手机”,当B查到了结果,就会马上打回A的手机号码,A就收到了结果。这就是一个完整的回调过程。




    然后再看看Android中的按钮监听事件onclicklistener


    一般我们的做法都是如下:

     



     


    1. Button b = (Button)this.findViewById(R.id.mybtn);  
    2. b.setOnClickListener(new OnClickListener(){  
    3. @Override  
    4. public void onClick(View v){  
    5. this,"按钮被点击",1000).show();  
    6.     }  
    7. });



    其实,这里的MainActivity类就相当于我们前面那个例子中的提问者A,MainActivity中的按钮b就相当于A的手机号码,b.setOnClickListener(...)是为按钮b注册监听事件,相当于将联系方式告诉B(上面例子中的帮助解决问题的人)


    在Android中触摸按钮点击事件是由Android系统调用的,Button继承链的顶端是View类,当用户触碰屏幕上的按钮时,就相当于B想到了解决问题的方法,即触发了View中封装好的onClick(),系统便会反过来调用用户重写的onClick()方法,

    这里的onClick就是我们所说的回调方法


     

     

     

    可能看了以上解释你还是有点模糊,我们再举个自定义Button的例子来说明这个过程:
    首先为我们自定义的按钮建立一个监听接口:

     

    1. public interface MyOnClickListener{  
    2. //这个方法就相当于我们平时写button实现监听事件时所重写的onClick()方法,留给用户重写  
    3. public void myOnClick();  
    4. }





     

    自定义Button类:

    1. public class MyButton {  
    2.       
    3. private MyOnClickListener listener;  
    4.       
    5. public MyButton(Context context){  
    6.           
    7.     }  
    8.       
    9. //注册监听事件  
    10. public void setMyOnClickListener(MyOnClickListener listener) {  
    11. this.listener = listener;  
    12.     }  
    13.       
    14. //模拟用户触摸屏幕时系统底层进行的操作  
    15. public void doClick(){  
    16.         listener.myOnClick();  
    17.     }  
    18.       
    19.   
    20. }




     

    用户调用:

    1. MyButton b = new MyButton(this);  
    2. //注册监听事件  
    3. b.setMyOnClickListener(new MyOnClickListener() {  
    4. //这个就是回调函数  
    5. @Override  
    6. public void myOnClick() {  
    7. // TODO Auto-generated method stub  
    8. //在此处由用户自行重写,当用户点击屏幕时,会触发系统去调用doClick方法  
    9. this, "自定义的按钮被点击", 1000).show();  
    10.     }  
    11. });  
    12. //模拟用户触摸屏幕的行为,调用系统处理点击的方法  
    13. 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也就是我们常说的回调方法。

     

     

     

    在上面这个例子的基础上,我们再通过加入一个字符串来加深回调的理解:
    在原来的基础上,给监听接口中的方法加入一个参数:

    1. public interface MyOnClickListener{  
    2. public void myOnClick(String s);  
    3. }

     

    在doClick方法中写入一个字符串:



    1. public void doClick(){  
    2. "回调字符串...");  
    3. }




     

     

    在重写点击方法那里进行打印:

     





    1. MyButton b = new MyButton();  
    2. b.setMyOnClickListener(new MyOnClickListener() {  
    3. @Override  
    4. public void myOnClick(String s) {  
    5. // TODO Auto-generated method stub  
    6. //这里的s就会是刚才我们传进去的那个字符串  
    7. "LayoutInflater---->", ""+s);  
    8.     }  
    9. });




     

     

    打印结果: