一. 实验目的
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 组件及其属性就可以了, 其他的代码用你系统自动生成的.
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
- Android:paddingLeft="@dimen/activity_horizontal_margin"
- Android:paddingRight="@dimen/activity_horizontal_margin"
- Android:paddingTop="@dimen/activity_vertical_margin"
- tools:context="com.example.nuist__njupt.shiyan3.MainActivity">
- <EditText
- Android:id = "@+id/show"
- Android:layout_width="match_parent"
- Android:layout_height="wrap_content"
- Android:editable="false"
- />
- <Button
- Android:id="@+id/button1"
- Android:layout_width="wrap_content"
- Android:layout_height="wrap_content"
- Android:text = "单击按钮"
- Android:layout_marginTop="30dp"
- Android:layout_below="@+id/show"
- Android:layout_centerHorizontal="true" />
- </RelativeLayout>
.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 EditText show = (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 属性, 是用来设置文本提示信息的.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin" Android:paddingLeft="@dimen/activity_horizontal_margin" Android:paddingRight="@dimen/activity_horizontal_margin" Android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.nuist__njupt.shiyan3.MainActivity"> <EditText Android:id = "@+id/show1" Android:layout_width="match_parent" Android:layout_height="wrap_content" Android:hint="请填写接受短信的手机号码" /> <EditText Android:id = "@+id/show2" Android:layout_width="match_parent" Android:layout_height="wrap_content" Android:hint="请填写短信内容" Android:layout_below="@+id/show1" Android:layout_alignParentRight="true" Android:layout_alignParentEnd="true" /> <Button Android:id="@+id/button1" Android:layout_width="wrap_content" Android:layout_height="wrap_content" Android:hint="发送" Android:layout_below="@+id/show2" Android:layout_alignParentLeft="true" Android:layout_alignParentStart="true" /> </RelativeLayout>
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 EditText address = (EditText) findViewById(R.id.show1) ;// 绑定第一个文本框 id 属性 final EditText content = (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 的完整路径 + 类名为 < com.example.nuist__njupt.shiyann.DrawView
你的要根据你自己的路径和类名去引用.
<?xml version="1.0" encoding="utf-8"?> <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:paddingBottom="@dimen/activity_vertical_margin" Android:paddingLeft="@dimen/activity_horizontal_margin" Android:paddingRight="@dimen/activity_horizontal_margin" Android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.nuist__njupt.shiyann.MainActivity"> <com.example.nuist__njupt.shiyann.DrawView Android:orientation = "vertical" Android:layout_width = "match_parent" Android:layout_height = "match_parent" /> </LinearLayout>
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, 创作不易, 如果对你有帮助, 点个赞再走吧, 谢谢!
来源: https://blog.csdn.net/nuist_NJUPT/article/details/105383628