天天看点

Android事件处理之基于监听的事件处理

在事件监听的处理模型中,主要涉及三类对象:

        Event Source(事件源):事件发生的场所,通常就是各个组件,例如按钮,窗口, 菜单等。

     Event(事件) :事件封装了界面组件上发生的特定事件(通常就是一次用户操作),如果程序需要获得界面组件上所发生事件的相关信息,一般通过Event对象来取得。

   Event Listener(事件监听器):负责监听事件源所发生的事件,并对各种事件做出相应的操作。事件监听器的核心就是它所包含的方法,这些方法称为事件处理器(Event Handler)。

  当用户按下一个按钮或者单击某个菜单时,这些动作就会激发一个相应的事件,该事件就会触发事件源上注册的事件监听器,事件监听器调用对应的事件处理器来做出相应的响应。

  Android的事件处理机制是一种委派式事件处理方法:普遍组件(事件源)将整个事件处理委托给特定的对象(事件监听器);当该事件源发生指定的事件时,就通知所委托的事件监听器,由事件监听器来处理这个事件。每个组件均可以针对特定的事件指定一个事件监听器,每个事件监听器也可监听一个或多个事件源。因为同一个事件源上可能发生多种事件,委派式事件处理方法可以把事件源上所有可能发生的事件分别授权给不同的事件监听器来处理;同时也可以让一类事件都使用同一个事件监听器来处理。

基于监听的事件处理模型的编程步骤如下:

  (1)获取普遍界面组件(事件源),也就是被监听的对象。

  (2)实现事件监听器类,该监听器类是一个特殊的Java类,必须实现以XxxListener接口。

  (3) 调用事件源的setXxxListener方法将事件监听器对象注册给普通组件(事件源)。

当事件源上发生指定事件时,Android会触发事件监听器,由事件监听器调用相应的方法(事件处理器)来处理事件。

基于监听的事件处理有如下规则:

   事件源:就是程序中的bn按钮,其实开发中不需要太多额外处理,应用程序中任何组件都可以作为事件源。

   事件监听器:就是程序中的MyClickListener类。监听器类必须有程序员负责实现。实现监听器类的关键就是实现处理器方法。

   注册监听器:只要调用事件源的setXxxListener(XxxListener)方法即可.

   下图为事件处理流程示意图。

Android事件处理之基于监听的事件处理

实现事件监听器的四种方法:

    (方法一): 内部类形式:将事件监听器类定义成当前的内部类

定义一个MyListener 实现 OnClickListener接口 

public class MainActivity extends Activity {

	private Button bn;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main); 
                bn = (Button) findViewById(R.id.bn);
                bn.setOnClickListener(new MyListener());  //为按钮绑定事件监听器
	}
		
     class MyListener implements OnClickListener{

    	  //实现监听器必须实现的方法,该方法将会作为事件处理器
		@Override
		public void onClick(View v) {  //按钮点击时,调用此方法。
            Toast.makeText(MainActivity.this, "方法一", Toast.LENGTH_LONG).show();			
		}
     }
     
}
           

(方法二) 匿名类部类形式:使用匿名内部类创建事件监听器对象。

@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main); 
                bn = (Button) findViewById(R.id.bn);
                bn.setOnClickListener(new OnClickListener() {
		
		@Override
		public void onClick(View v) {
			 Toast.makeText(MainActivity.this, "第二种方法", Toast.LENGTH_LONG).show();
		}
	     });
	}
           

(方法三)Activity 本身作为事件监听器类: 让Activity本身实现监听器接口,并实现事件处理方法。

public class MainActivity extends Activity  implements OnClickListener{

	private Button bn;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main); 
         bn = (Button) findViewById(R.id.bn);
        bn.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
         Toast.makeText(this, "第三种", Toast.LENGTH_LONG).show();		
	}
}
           

(方法四)直接绑定到标签: 直接在界面布局文件中为指定标签绑定事件处理方法。

给Button节点设置onClick属性: android:onClick="click"

  然后在activity中定义跟该属性值同名的方法

<Button
        android:id="@+id/bn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="148dp"
       <span style="color:#ff0000;"> android:onClick="click"</span>
        android:text="点击" />
           
public class MainActivity extends Activity  {
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_main);       
            }

            public void click(View view ){ //定义一个事件处理方法,view参数代表事件源
                  Toast.makeText(this, "第四中", Toast.LENGTH_LONG).show();
            }
}
           

继续阅读