Android应用事件处理
一. 实验目的
1.掌握内部类作为事件监听器的事件处理
2.掌握外部类作为事件监听器的事件处理
3.掌握基于回调的事件处理
二. 实验内容
1.内部类作为事件监听器。设计一个APP,界面包含一个EditText和一个Button。用户点击按钮后,EditText显示bn按钮被单击了,要求:使用匿名内部类的实例作为事件监听器,显示如下图所示。
文章图片
2.外部类作为事件监听器。创建一个项目,界面中包含2个EditText和1个按钮,用户点击按钮时显示提示信息:短信发送完成,可参考下图所示。要求:使用外部类作为监听器。
文章图片
3.通过回调实现跟随手指的小球,绘制小球类名为:DrawView,小球半径15,画笔颜色为红色,通过重写onTouchEvent事件实现,布局文件为main.xml,如下图所示。
文章图片
三、实验步骤
(1) 建立项目,在xml文件中布局,我采用的是默认的相对布局,将自动生成的Textview组件删除,添加EditText组件和Button组件就可以了,其中布局EditText组件,需要四行代码,分别是设置id属性名称为show,设置文本框的宽度和手机界面一样宽,设置文本框的高度为恰好可以包裹文字,设置文本框为不可编辑型。布局Button组件,主要是设置文本框id属性名为button1,设置宽和高是包住文字的大小,设置按钮文本名称为单击按钮,其余代码是位置代码,可以直接在设计视图拖动按钮,代码自动生成。
(2) 在.java文件中设置事件监听器,监听按钮,首先需要做的是绑定文本框id,然后绑定按钮id,设置监听器监听按钮,最后在监听结果文本框显示。
(3)在模拟器上运行。
XML布局代码如下,你只需要添加EditText组件和Button组件及其属性就可以了,其他的代码用你系统自动生成的。
.java文件中的事件代码如下:主要就是三步,绑定文本框id和绑定按钮id,设置监听器监听按钮,最后在监听结果文本框显示。这个是通过匿名内部类实现的。
注意:如果代码有标红,把鼠标放到标红位置按下快捷键alt+enter,会软件提供解决问题的方法。
public class MainActivity extends ActionBarActivity {@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditTextshow = (EditText) findViewById(R.id.show) ;
//绑定文本框id属性
Button button = (Button) findViewById(R.id.button1) ;
//绑定按钮id属性
button.setOnClickListener(new View.OnClickListener() { //为按钮设置匿名内部监听器
@Override
public void onClick(View view) {
show.setText("按钮被点击了!") ;
//按钮被点击后在文本框显示
}
});
}
}
演示效果如图所示:
文章图片
(1)首先有在XML布局,我采用的是系统默认的相对布局,只需要将TextView组件删除,在其中增加两个EditText组件和一个按钮组件就可以了。
(2) 在MainActivity.java文件中绑定按钮和文本框的id属性,使用匿名外部监听器监听事件,在java文件夹下创建一个名为Send的activity,在其中设置获取短信号码和获取短信内容的代码,获取短信管理器,发送文本短信,然后提示短信发送成功。
(3)在模拟中运行。
XML布局的代码如下:我使用的是默认的相对布局,你只需要使用其中的两个EditText组件和一个按钮组件及其相关属性的代码就可以了,其余代码直接用系统自动生成的。都是常见的
属性,其中有个hint属性,是用来设置文本提示信息的。
MainActivity.java中的代码如下:
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends ActionBarActivity {@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditTextaddress = (EditText) findViewById(R.id.show1) ;
//绑定第一个文本框id属性
final EditTextcontent = (EditText) findViewById(R.id.show2) ;
//绑定第二个文本框id属性
Button button = (Button) findViewById(R.id.button1) ;
//绑定按钮id属性
//使用匿名外部类监听事件
button.setOnClickListener(new Send(this,address, content));
}
}
Send.java文件中的代码如下:此文件是在java文件夹下创建的activity,用来设置外部监听方法的。
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
//author WangGuodong
public class Send implements View.OnClickListener {
private Activity act ;
private EditText address ;
private EditText content ;
public Send(Activity act, EditText address,EditText content ){ //带三个参数的构造方法
this.act = act ;
this.address = address ;
this.content = content ;
}
@Override
public void onClick(View view) {
String s1 = address.getText().toString() ;
//获取地址信息,也就是输入的文本框的手机号码
String s2 = content.getText().toString() ;
//获取短信内容信息
SmsManager s3 = SmsManager.getDefault() ;
//获取短信管理器
PendingIntent s4 = PendingIntent.getBroadcast(act, 0, new Intent(), 0) ;
//创建发送短信的PendingInten
s3.sendTextMessage(s1,null,s2,s4,null);
//发送文本短信
Toast.makeText(act,"短信成功发送", Toast.LENGTH_LONG).show() ;
}
}
模拟器演示结果如下:
文章图片
(1)第一步,就是自定义一个View子类,实现小球的效果,小球的移动原理是通过onTouchEvent回调,实时返回手指触碰屏幕的位置,赋值给小球的位置坐标,并通知onDraw重绘。
(2)第二步是引用自定义的View,引用的方法就是将自定义View的完整路径+类名作为一个组件,写入XML中。
(3)第三步在MainActivity.java中设置最基本的引入布局文件。
(4)模拟器运行。
XML布局代码:
注意:其中我的自定义组件View的完整路径+类名为
【Android应用事件处理】DrawView.java中绘制小球和重绘小球的代码:
注意:DrawView.java是在java文件夹下创建的名为DrawView的activity。
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
public class DrawView extends View{
public float currentX = 40;
public float currentY = 50;
// 定义、创建画笔
Paint p = new Paint();
public DrawView(Context context, AttributeSet set) {
super(context, set);
}
@Override public void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 设置画笔的颜色
p.setColor(Color.RED);
// 绘制一个小圆(作为小球)
canvas.drawCircle(currentX, currentY, 15, p);
}
@Override public boolean onTouchEvent(MotionEvent event) {
// 当前组件的currentX、currentY两个属性
this.currentX = event.getX();
this.currentY = event.getY();
// 通知改组件重绘
this.invalidate();
// 返回true表明处理方法已经处理该事件
return true;
}}
MainActivity.java中设置最基本的引入布局文件的代码:
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends ActionBarActivity {@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}}
模拟器运行效果如下:
因为是动态效果,就是红色圆点跟随鼠标触碰的位,截图为静态,看不到很好的效果。
文章图片
本文原创,author WangGuodong,创作不易,如果对你有帮助,点个赞再走吧,谢谢!
推荐阅读
- Docker应用:容器间通信与Mariadb数据库主从复制
- android第三方框架(五)ButterKnife
- JS中的各种宽高度定义及其应用
- Android中的AES加密-下
- 事件代理
- 带有Hilt的Android上的依赖注入
- 事件处理程序
- android|android studio中ndk的使用
- Android事件传递源码分析
- RxJava|RxJava 在Android项目中的使用(一)