Android学习笔记1:基于监听的事件处理过程

本文深入讲解安卓应用中基于监听的事件处理机制,包括点击、长按、焦点变化、键盘及触摸事件的处理流程与实现样例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于监听的事件处理过程

记录一:安卓界面交互处理事件的两个方式

(1)基于监听的事件处理

(2)基于回调的事件处理

基于回调的事件处理日后再写,先学习基于监听的事件处理

通常以下步骤:

(1)实例化对象

(2)为事件源对象添加监听器对象,例如set...Listener();

(3)当事件发生时,系统会将事件封装成相应类型的对象,发送给注册事件源的监听器对象

(4)当监听器对象接收事件对象后,系统会调用监听器中相应的事件处理方法来处理事件给出响应

常用的监听接口有OnClickListener接口、OnLongClickListener接口、OnFocusChangeListener接口、OnKeyListener接口和OnTouchListener接口五种

OnClickListener使用:

java代码

package lesson.ssh.listenertest;

import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//实例化事件源
		Button btn = (Button) findViewById(R.id.button1);
		//为事件源注册监听接口
		btn.setOnClickListener(new OnClickListener() {
			//实现监听接口内的事件处理方法
			@Override
			public void onClick(View v) {
				//在MainActivity活动中给出一个提示
				//提示内容为"You clicked the button"
				//Toast.LENGTH_SHORT短暂时间显示
				//使用Toast中的show()方法显示提示
				Toast.makeText(MainActivity.this, "You clicked the button",
						Toast.LENGTH_SHORT).show();
			}

		});
	}

布局文件:就一个按钮

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

</LinearLayout>

效果略,点击按钮后就是一个吐司。

但是当有很多个按钮的时候,像这样一个一个实例化,注册,监听,还是很麻烦的,因此可以有另外一种处理方法,在布局文件中组件使用属性android:onClick="onClick",这个方法只需要在活动中实现即可。引号里面的是在java代码中要实现的方法名,随意即可,但要一致。下面是一个具体的方法

布局代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".GameMain" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
		android:textSize="28dp"
		android:gravity="center"
        android:text="@string/app_name"/>
	<Button 
	    android:id="@+id/btn_about"
	    android:layout_width="200dp"
	    android:layout_height="wrap_content"
	    android:gravity="center"
	    android:text="@string/app_about"
	    android:textSize="18dp"
	    android:onClick="onClick"/>
	<Button 
	    android:id="@+id/btn_exit"
	    android:layout_width="200dp"
	    android:layout_height="wrap_content"
	    android:gravity="center"
	    android:text="@string/app_exit"
	    android:textSize="18dp"
	    android:onClick="onClick"/>
</LinearLayout>

java代码:GameMain.java

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;

public class GameMain extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.game_main);
    }
    
    //此处函数是针对点击按钮后发生的反应
    public void onClick(View view)
    {
    	switch(view.getId())    //检测是那个按钮被点击了,查找id
    	{
    	case R.id.btn_about:
    		Toast.makeText(GameMain.this, "点击了about按钮", Toast.LENGTH_SHORT).show();
    		break;
    	case R.id.btn_exit:
    		this.finish();    //这个是程序退出
    		break;
    	}
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.game_main, menu);
        return true;
    }
    
}

 

OnLongClickListener:

跟OnClickListener差不多

比如用于按钮,长时间按按钮才对触发的

都是先找控件、设监听,重写监听接口内的事件处理方法

package lesson.ssh.listenertest;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnLongClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		/**
		 * findViewById(int)的返回值是View类的实例
		 * */
		final TextView tv=(TextView)findViewById(R.id.textView1);
		//实例化事件源
		Button btn = (Button) findViewById(R.id.button1);
		//为事件源注册监听接口
		btn.setOnLongClickListener(new OnLongClickListener(){

			@Override
			public boolean onLongClick(View v) {
				// TODO Auto-generated method stub
				/**
				 * 设置文本显示内容为“You clicked me!”
				 * 设置字体大小为30f
				 * 设置字体颜色为绿色
				 */
				tv.setText("You clicked me!");
				tv.setTextSize(30f);
				tv.setTextColor(Color.GREEN);

                                //此处用java实现TextView,当然也可以跟上边那个用Toast

				return false;
			}
			
		});
		
	}

}

 

OnFocusChangeListener接口:

用来处理控件焦点发生改变的事件。当某个控件失去焦点或者获得焦点时都会触发该接口中的回调方法

回调方法:

public void onFocusChanges(View v,Boolean hasFocus)
//参数View v:v是触发该事件的事件源
//参数hasFocus:参数hasFocus表示v的新状态,即v是否是获得焦点

具体的实现样例

/**
 * 本次注册监听接口和原来有别,原来是在事件源上注册监听器,而本次是在活动上使用implements来继承监听接口
 * 然后使用某个视图组件的实例,进行注册,注册方法xxx.setOnFocusChangeListener(this),xxx是视图组件
 * 然后在你活动中重构并完成该接口的抽象方法onFocusChange
 * */
public class MainActivity extends Activity implements OnFocusChangeListener{
	TextView tv=null;
	EditText et1=null;
	EditText et2=null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		/**
		 * findViewById(int)的返回值是View类的实例
		 * 使用该方法实例化tv,et1,et2
		 * */
		tv=(TextView)findViewById(R.id.textView1);//布局文件中,预留了id为textView1的TextView
		tv.setTextSize(30f);
		tv.setTextColor(Color.GREEN);
		et1=(EditText)findViewById(R.id.editText1);
		et2=(EditText)findViewById(R.id.editText2);
		/**
		 * 在事件源上注册监听接口
		 * */
		et1.setOnFocusChangeListener(this);
		et2.setOnFocusChangeListener(this);
		
	}
	/**
	 * 重构并完成监听接口OnFocusChangeListener的抽象方法onFocusChange(View v, boolean hasFocus)
	 * 参数View arg0指的是与焦点有关的视图组件,boolean hasFocus的值有true和false之分,true代表获得焦点,false
	 * 表示失去焦点
	 * */
	@Override
	public void onFocusChange(View v, boolean hasFocus) {
		// TODO Auto-generated method stub
		switch(v.getId())
		{case R.id.editText1:    //监听到第一个编辑框焦点改变
			if(hasFocus==true)    
			{
				tv.setText("EditText1 has focused");
			}			
			break;
		case R.id.editText2:    //监听到第二个编辑框焦点发生改变
			if(hasFocus==true)   
			{
				tv.setText("EditText2 has focused");
			}
			break;
		}
	}

}

布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </EditText>

    <EditText
        android:id="@+id/editText2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

(4)OnKeyListener接口

对手机键盘进行监听的接口,通过对某个View注册该监听,当View获得焦点并有键盘事件时,便会触发该接口中的回调方法

回调方法:

public boolean onKey(View v,int keyCode,KeyEvent event)
//参数v:为事件的事件源控件
//参数keyCode: 参数keyCode为手机键盘的键盘码
//参数event:参数event为键盘事件封装类的对象,其中包含了事件的详细信息,例如发生的事件,事件的类型等

(5)OnTouchListener接口

用来处理手机屏幕事件的监听接口的。当为View的范围内触摸按下、抬起或滑动等动作时都会触发该事件。

回调方法:

public boolean onTouch(View v,MotionEvent event)
//参数v:需要实现onTouch方法
//参数event:参数event为事件封装类的对象,其中封装了触发事件的详细信息,同样包括事件的类型、触发时间等信息

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值