基于监听的事件处理过程
记录一:安卓界面交互处理事件的两个方式
(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为事件封装类的对象,其中封装了触发事件的详细信息,同样包括事件的类型、触发时间等信息