android的事件处理1(监听 回调 handle)

来源:互联网 发布:网络流行年轻群体文化 编辑:程序博客网 时间:2024/06/03 21:16

    1.监听

事件源:任何组件,buttun等.

事件监听器:myclicklistener

注册监听器:setxxxlistener



1)内部类作为事件监听器类:

可以访问外部类所有的界面组件.

2)外部类作为事件监听器类:

不能自由的访问界面的组件;

如果某个监听器确实需要被多个界面共享,而且主要是完成某种业务逻辑.


界面:

public class SendSms extends Activity{EditText address;EditText content;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);address = (EditText)findViewById(R.id.address);content = (EditText)findViewById(R.id.content);Button bn = (Button)findViewById(R.id.send);bn.setOnLongClickListener(new SendSmsListener(this , address, content));}}


外部类:

public class SendSmsListener implements OnLongClickListener{private Activity act;private EditText address;private EditText content;public SendSmsListener(Activity act, EditText address, EditText content){this.act = act;this.address = address;this.content = content;}@Overridepublic boolean onLongClick(View source){String addressStr = address.getText().toString();String contentStr = content.getText().toString();SmsManager smsManager = SmsManager.getDefault();PendingIntent sentIntent = PendingIntent.getBroadcast(act, 0, new Intent(), 0);smsManager.sendTextMessage(addressStr, null, contentStr, sentIntent, null);return false;}}



3)activity本身作为监听器,很混乱,不推荐

4)匿名内部类,大家都用的那种,不赘诉.

5)直接绑定到xml.android:onclick="";


 

2.回调

  • Class A实现接口CallBack callback——背景1
  • class A中包含一个class B的引用b ——背景2
  • class B有一个参数为callback的方法f(CallBack callback) ——背景3
  • A的对象a调用B的方法 f(CallBack callback) ——A类调用B类的某个方法 C
  • 然后b就可以在f(CallBack callback)方法中调用A的方法 ——B类调用A类的某个方法D
下面代码摘自http://blog.csdn.net/xiaanming/article/details/8703708
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. //这个是View的一个回调接口  
  2. /** 
  3.  * Interface definition for a callback to be invoked when a view is clicked. 
  4.  */  
  5. public interface OnClickListener {  
  6.     /** 
  7.      * Called when a view has been clicked. 
  8.      * 
  9.      * @param v The view that was clicked. 
  10.      */  
  11.     void onClick(View v);  
  12. }  

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. package com.example.demoactivity;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.view.View;  
  6. import android.view.View.OnClickListener;  
  7. import android.widget.Button;  
  8. import android.widget.Toast;  
  9.   
  10. /** 
  11.  * 这个就相当于Class A 
  12.  * @author xiaanming 
  13.  * 实现了 OnClickListener接口---->背景一 
  14.  */  
  15. public class MainActivity extends Activity implements OnClickListener{  
  16.     /** 
  17.      * Class A 包含Class B的引用----->背景二 
  18.      */  
  19.     private Button button;  
  20.   
  21.     @Override  
  22.     public void onCreate(Bundle savedInstanceState) {  
  23.         super.onCreate(savedInstanceState);  
  24.         setContentView(R.layout.activity_main);  
  25.         button = (Button)findViewById(R.id.button1);  
  26.           
  27.         /** 
  28.          * Class A 调用View的方法,而Button extends View----->A类调用B类的某个方法 C 
  29.          */  
  30.         button.setOnClickListener(this);  
  31.     }  
  32.   
  33.     /** 
  34.      * 用户点击Button时调用的回调函数,你可以做你要做的事 
  35.      * 这里我做的是用Toast提示OnClick 
  36.      */  
  37.     @Override  
  38.     public void onClick(View v) {  
  39.         Toast.makeText(getApplication(), "OnClick", Toast.LENGTH_LONG).show();  
  40.     }  
  41.   
  42. }  

下面是View类的setOnClickListener方法,就相当于B类咯,只把关键代码贴出来

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /** 
  2.  * 这个View就相当于B类 
  3.  * @author xiaanming 
  4.  * 
  5.  */  
  6. public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource {  
  7.     /** 
  8.      * Listener used to dispatch click events. 
  9.      * This field should be made private, so it is hidden from the SDK. 
  10.      * {@hide} 
  11.      */  
  12.     protected OnClickListener mOnClickListener;  
  13.       
  14.     /** 
  15.      * setOnClickListener()的参数是OnClickListener接口------>背景三 
  16.      * Register a callback to be invoked when this view is clicked. If this view is not 
  17.      * clickable, it becomes clickable. 
  18.      * 
  19.      * @param l The callback that will run 
  20.      * 
  21.      * @see #setClickable(boolean) 
  22.      */  
  23.       
  24.     public void setOnClickListener(OnClickListener l) {  
  25.         if (!isClickable()) {  
  26.             setClickable(true);  
  27.         }  
  28.         mOnClickListener = l;  
  29.     }  
  30.       
  31.       
  32.     /** 
  33.      * Call this view's OnClickListener, if it is defined. 
  34.      * 
  35.      * @return True there was an assigned OnClickListener that was called, false 
  36.      *         otherwise is returned. 
  37.      */  
  38.     public boolean performClick() {  
  39.         sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);  
  40.   
  41.         if (mOnClickListener != null) {  
  42.             playSoundEffect(SoundEffectConstants.CLICK);  
  43.               
  44.             //这个不就是相当于B类调用A类的某个方法D,这个D就是所谓的回调方法咯  
  45.             mOnClickListener.onClick(this);  
  46.             return true;  
  47.         }  
  48.   
  49.         return false;  
  50.     }  
  51. }  

3.handle

出现的原因:android平台只允许主线程修改Activity的UI组件,这样就导致新启动的线程无法改变界面组件的属性值,如果要修改,就得用handle的消息传递机制.

Handle类的作用:
在新启动的线程中发送消息.
在主线程中获取,处理消息.


相当于在子线程里发个消息,主线程里接受到这个消息,然后修改组件,子线程只是发消息,修改还是在主线程


public class HandlerPostActivity1 extends Activity {    private Button btnMes1,btnMes2;    private TextView tvMessage;    // 声明一个Handler对象    private static Handler handler=new Handler();        @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.message_activity);                        btnMes1=(Button)findViewById(R.id.btnMes1);        btnMes2=(Button)findViewById(R.id.btnMes2);        tvMessage=(TextView)findViewById(R.id.tvMessage);        btnMes1.setOnClickListener(new View.OnClickListener() {                        @Override            public void onClick(View v) {                // 新启动一个子线程                new Thread(new Runnable() {                                        @Override                    public void run() {                        // tvMessage.setText("...");                        // 以上操作会报错,无法再子线程中访问UI组件,UI组件的属性必须在UI线程中访问                        // 使用post方式修改UI组件tvMessage的Text属性                        handler.post(new Runnable() {                                                @Override                            public void run() {                                tvMessage.setText("使用Handler.post在工作线程中发送一段执行到消息队列中,在主线程中执行。");                                                    }                        });                                                    }                }).start();            }        });                btnMes2.setOnClickListener(new View.OnClickListener() {                        @Override            public void onClick(View v) {                new Thread(new Runnable() {                                        @Override                    public void run() {                        // 使用postDelayed方式修改UI组件tvMessage的Text属性值                        // 并且延迟3S执行                        handler.postDelayed(new Runnable() {                                                        @Override                            public void run() {                                tvMessage.setText("使用Handler.postDelayed在工作线程中发送一段执行到消息队列中,在主线程中延迟3S执行。");                                                                }                        }, 3000);                                            }                }).start();                            }        });    }}



例子2:定时换图片

public class HandlerTest extends Activity{int[] imageIds = new int[]{R.drawable.java,R.drawable.ee,R.drawable.ajax,R.drawable.xml,R.drawable.classic};int currentImageId = 0;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);final ImageView show = (ImageView) findViewById(R.id.show);final Handler myHandler = new Handler(){@Overridepublic void handleMessage(Message msg){if (msg.what == 0x1233){show.setImageResource(imageIds[currentImageId++% imageIds.length]);}}};new Timer().schedule(new TimerTask(){@Overridepublic void run(){myHandler.sendEmptyMessage(0x1233);}}, 0, 1200);}}



0 0
原创粉丝点击