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组件及其属性就可以了,其他的代码用你系统自动生成的。

<?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,创作不易,如果对你有帮助,点个赞再走吧,谢谢!

发布了52 篇原创文章 · 获赞 45 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/nuist_NJUPT/article/details/105383628
今日推荐