基于监听的事件处理

当用户在程序界面上执行各种操作时,用户程序必须为用户动作提供相应动作,这种响应动作通过事件处理来完成。
Android提供了两种事件处理:基于回调的事件处理,基于监听的事件处理。
1.1监听的处理模型
主要涉及三类对象
EventSource(事件源)事件发生的场所,通常就是各种组件,例如按钮、窗口、菜单
Event(事件)事件封装了界面组件上发生的特定事情(通常是一次用户操作),如果程序想获得界面组件上所发生事件的相关信息,一般通过Event对象来获得
EventListener(事件监听器)负责监听事件源所发生的事件,并对其进行相应。
四种监听类写法
1:内部类作为事件监听器类
程序清单:
  
  
    
    
package com.jerehedu.android_cursor.ch01;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.TextView;
 
import com.jerehedu.android_cursor.R;
 
 
public class EmailActivity extends Activity implements View.OnClickListener,
CompoundButton.OnCheckedChangeListener {
 
private TextView tvMsg;
private EditText etMail;
private Button btEmail;
 
private Button btAgree;
private CheckBox ckAgree;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//1、代码构建界面
//2、通过布局文件构建界面
setContentView(R.layout.activity_email);
tvMsg=(TextView)findViewById(R.id.tvMsg);
etMail=(EditText)findViewById(R.id.etEmail);
btEmail=(Button)findViewById(R.id.btOk);
btAgree=(Button)findViewById(R.id.btAgree);
ckAgree=(CheckBox)findViewById(R.id.ckAgree);
initView();
 
}
private void initView(){
btEmail.setOnClickListener(this);
ckAgree.setOnCheckedChangeListener(this);
}
 
@Override
public void onClick(View view) {
String email=etMail.getText().toString();
int pos1=email.indexOf("@");
int pos2=email.indexOf(".");
if(pos1==-1||pos2==-1||pos2<pos1){
tvMsg.setVisibility(View.VISIBLE);
}else{
tvMsg.setVisibility(View.GONE);
}
}
 
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
if(isChecked){
//布局文件中有哪些属性,代码中就一定有相应的方法进行操作
btAgree.setEnabled(true);
}else{
btAgree.setEnabled(false);
}
 
}
}

2:外部类作为事件监听器类
程序清单
   
   
     
     
package com.jerehedu.android_cursor.ch01;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;
 
import com.jerehedu.android_cursor.R;
 
 
public class RegActivity extends Activity {
private Button btReg,btReSet;
private RadioGroup rgSexGroup;
private CheckBox ck1,ck2,ck3;
private RadioButton rbBoy,rbGirl;
//当Activity执行,调用onCreate
//构建Activity初始界面
@Override
public void onCreate(Bundle bundle){
super.onCreate(bundle);//调用父类方法
//设置界面
//1、编写代码
//2、通过布局文件(xml)
//R 1、有系统的R资源 2、自身项目R资源
//setContentView()
super.setContentView(R.layout.reg_layout);
btReg=(Button)super.findViewById(R.id.btReg);
btReSet=(Button)super.findViewById(R.id.btReset);
rgSexGroup=(RadioGroup)super.findViewById(R.id.rgSexGroup);
rgSexGroup.check(R.id.rbBoy);//设置单选按钮的选择状态
//注册单选按钮的值改变事件
//
rgSexGroup.setOnCheckedChangeListener(new MyOnCheckedChangeListener());
ck1=(CheckBox)super.findViewById(R.id.ck1);
ck2=(CheckBox)super.findViewById(R.id.ck2);
ck3=(CheckBox)super.findViewById(R.id.ck3);
ck1.setOnCheckedChangeListener(new CheckBoxChangeListener());
ck2.setOnCheckedChangeListener(new CheckBoxChangeListener());
ck3.setOnCheckedChangeListener(new CheckBoxChangeListener());
 
rbBoy=(RadioButton)super.findViewById(R.id.rbBoy);
rbGirl=(RadioButton)super.findViewById(R.id.rbGirl);
btReg.setOnClickListener(new MyClickListener());
btReSet.setOnClickListener(new MyClickListener());
 
}
 
private class CheckBoxChangeListener implements CompoundButton.OnCheckedChangeListener{
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
String msg="";
switch(buttonView.getId()){
case R.id.ck1:
if(isChecked){
msg=ck1.getText().toString()+"选择";
}else{
msg=ck1.getText().toString()+"未选择";
}
break;
case R.id.ck2:
if(isChecked){
msg=ck1.getText().toString()+"选择";
}else{
msg=ck1.getText().toString()+"未选择";
}
break;
case R.id.ck3:
if(isChecked){
msg=ck1.getText().toString()+"选择";
}else{
msg=ck1.getText().toString()+"未选择";
}
break;
}
Toast.makeText(RegActivity.this,msg,Toast.LENGTH_LONG).show();
}
}
 
 
private class MyOnCheckedChangeListener implements
RadioGroup.OnCheckedChangeListener{
 
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
RadioButton selectButton=(RadioButton)group.findViewById(checkedId);
String selvalue=selectButton.getText().toString();
 
Toast.makeText(RegActivity.this,"当前选项:"+selvalue,Toast.LENGTH_LONG).show();
}
}
private class MyClickListener implements View.OnClickListener{
/**
* 事件处理程序
* @param v 当前引发事件的UI组件
*/
@Override
public void onClick(View v) {
//获得view的id标识
int vid=v.getId();
switch(vid){
case R.id.btReg:
Toast.makeText(RegActivity.this,"执行注册",Toast.LENGTH_LONG).show();
break;
case R.id.btReset:
Toast.makeText(RegActivity.this,"执行重新填写",Toast.LENGTH_LONG).show();
break;
}
 
 
}
}
 
}
3:匿名内部类为事件监听类
程序清单:
     
     
       
       
vpIdx.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
 
}
 
@Override
public void onPageSelected(int position) {
if (position == 0) {
group.check(R.id.rb1);
} else {
group.check(R.id.rb2);
}
 
}
 
@Override
public void onPageScrollStateChanged(int state) {
 
}
});

4:Activity本身作为事件监听类
程序清单
     
     
       
       
public class EmailActivity extends Activity implements View.OnClickListener,
CompoundButton.OnCheckedChangeListener {
 
private TextView tvMsg;
private EditText etMail;
private Button btEmail;
 
private Button btAgree;
private CheckBox ckAgree;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//1、代码构建界面
//2、通过布局文件构建界面
setContentView(R.layout.activity_email);
tvMsg=(TextView)findViewById(R.id.tvMsg);
etMail=(EditText)findViewById(R.id.etEmail);
btEmail=(Button)findViewById(R.id.btOk);
btAgree=(Button)findViewById(R.id.btAgree);
ckAgree=(CheckBox)findViewById(R.id.ckAgree);
initView();
 
}
private void initView(){
btEmail.setOnClickListener(this);
ckAgree.setOnCheckedChangeListener(this);
}
 
@Override
public void onClick(View view) {
String email=etMail.getText().toString();
int pos1=email.indexOf("@");
int pos2=email.indexOf(".");
if(pos1==-1||pos2==-1||pos2<pos1){
tvMsg.setVisibility(View.VISIBLE);
}else{
tvMsg.setVisibility(View.GONE);
}
}
 
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
if(isChecked){
//布局文件中有哪些属性,代码中就一定有相应的方法进行操作
btAgree.setEnabled(true);
}else{
btAgree.setEnabled(false);
}
 
}
}

实际上我们大多采用内部类的写法
原因:使用内部类可以在当前类中复用该监听类;因为监听类是外部类的内部类,所以可以自由访问内部类的所有界面组件。
























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值