博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Studio开发学习(十四)——事件处理机制
阅读量:3917 次
发布时间:2019-05-23

本文共 9286 字,大约阅读时间需要 30 分钟。

一、前提

事件处理机制也有很多类型,在这里将简介几种常用的处理机制

二、目标

1、基于监听的事件处理机制

2、基于回调的事件处理机制

3、Handler

三、内容

1、基于监听的事件处理机制

监听事件处理有很多种方式,这里将会简介五种关于点击事件的处理方式

(1)通过android:OnClick=""方式处理

此方法用于在xml文件中添加,首先先布局一个按钮

在MainActivity中添加

package com.example.sunny.eventactivity;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.Toast;public class MainActivity extends AppCompatActivity{    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }    public void show(View v){        switch (v.getId()){            case R.id.btn:                Toast.makeText(MainActivity.this,"click",Toast.LENGTH_SHORT).show();                break;        }    }}

(2)内部类,在一个类的内部再写一个类,调用

package com.example.sunny.eventactivity;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.Toast;public class MainActivity extends AppCompatActivity{    private Button button;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        button= (Button) findViewById(R.id.btn);        //内部类实现        button.setOnClickListener(new OnClick());    }    class OnClick implements View.OnClickListener{        @Override        public void onClick(View v) {            switch(v.getId()){                case R.id.btn:                    Toast.makeText(MainActivity.this,"click",Toast.LENGTH_SHORT).show();                    break;            }        }    }}

(3)匿名内部类,使用的最常见的方法

package com.example.sunny.eventactivity;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.Toast;public class MainActivity extends AppCompatActivity{    private Button button;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        button= (Button) findViewById(R.id.btn);        //匿名内部类        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Toast.makeText(MainActivity.this,"click",Toast.LENGTH_SHORT).show();            }        });    }}

(4)通过事件源所在的类实现,通过接口实现点击事件监听器,重写其方法后调用

package com.example.sunny.eventactivity;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.Toast;public class MainActivity extends AppCompatActivity implements View.OnClickListener{    private Button button;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        button= (Button) findViewById(R.id.btn);        //通过事件源所在的类实现        button.setOnClickListener(MainActivity.this);    }    @Override    public void onClick(View v) {        switch(v.getId()){            case R.id.btn:                Toast.makeText(MainActivity.this,"click",Toast.LENGTH_SHORT).show();                break;        }    }}

(5)外部类,首先先新建一个java类,之后在MainActivity中调用(使用的不多)

package com.example.sunny.eventactivity;import android.app.Activity;import android.view.View;import android.widget.Toast;/** * Created by Sunny on 2020/4/27. */public class OnClickListener implements View.OnClickListener{    private Activity activity;    public OnClickListener(Activity activity){        this.activity=activity;    }    @Override    public void onClick(View v) {        Toast.makeText(activity,"click",Toast.LENGTH_SHORT).show();    }}
package com.example.sunny.eventactivity;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.Toast;public class MainActivity extends AppCompatActivity{    private Button button;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        button= (Button) findViewById(R.id.btn);        //通过外部类实现        button.setOnClickListener(new OnClickListener(MainActivity.this));    }}

注:

如果给同一事件添加多个同种类型监听器,意思也就是说,如果给一个按钮添加多个点击事件监听器,系统只会执行设置的最后一个事件监听器,如果在一个代码中,针对一个按钮,你先通过内部类设置一个事件,在通过匿名内部类设置同样一个事件,则只会执行匿名内部类设置的事件,覆盖了之前内部类设置的事件

以上五种方法的中间三种较为常用,当然也要根据项目来定

 

2、基于回调的事件处理机制

也有很多,像是触摸,抬起,摁下,都是回调方法

首先重写一个java类继承AppCompatButton,添加构造方法,重写onTouchEvent()触摸事件方法,代码意思是,当手指摁下时控制台打印内容

package com.example.sunny.eventactivity;import android.content.Context;import android.support.v7.widget.AppCompatButton;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.widget.Button;/** * Created by Sunny on 2020/4/27. */public class MyButton extends AppCompatButton {    public MyButton(Context context) {        super(context);    }    public MyButton(Context context, AttributeSet attrs) {        super(context, attrs);    }    public MyButton(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    @Override    public boolean onTouchEvent(MotionEvent event) {        super.onTouchEvent(event);        switch (event.getAction()){            case MotionEvent.ACTION_DOWN:                Log.d("MyButton","--OnTouchEvent--");                break;        }        return false;    }}

在activity_main布局文件中在添加一个按钮,注意这个按钮,是通过之前java类重写后自身设置的按钮

在MainActivity中添加,在主函数中也有onTouchEvent()方法,我们将它重写,且按钮自身也有触摸的监听事件

package com.example.sunny.eventactivity;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.widget.Button;import android.widget.Toast;import static com.example.sunny.eventactivity.R.id.mybutton;public class MainActivity extends AppCompatActivity{    private MyButton myButton;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        myButton= (MyButton) findViewById(mybutton);        myButton.setOnTouchListener(new View.OnTouchListener() {            @Override            public boolean onTouch(View v, MotionEvent event) {                switch (event.getAction()){                    case MotionEvent.ACTION_DOWN:                        Log.d("Listener","--OnTouchEvent--");                        break;                }                return false;            }        });    }    @Override    public boolean onTouchEvent(MotionEvent event) {        switch (event.getAction()){            case MotionEvent.ACTION_DOWN:                Log.d("MainActivity","--OnTouchEvent--");                break;        }        return  false;    }}

android.util.Log常用的方法有以下5个:Log.v() Log.d() Log.i() Log.w() 以及 Log.e() ,这些方法都是用来调试时查看信息的,各有各的用处以及显示的颜色,这里不多叙述

运行后我们可以看见它先执行了监听器中的方法,之后执行了Button类的方法,最后执行了主函数中的方法,这个是有优先级的,优先执行监听器的方法,在执行回调,回调将从控件本身内部开始,向外逐渐扩散。如果想表示到某一层你不想继续让它回调时,可将return false改为true表示到这一步自行解决,不用向外继续扩散。

 

3、Handler消息处理

Handler作为一个消息处理机制很常用且很灵活,这里简单的介绍一下,以下的代码表示一个常用的消息处理,三秒后页面自动跳转的处理,postDelayed()方法表示将可运行的r添加到消息队列中,使其在指定的时间量过期后运行。runnable将在附加该处理程序的线程上运行。

package com.example.sunny.handler;import android.content.Intent;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.Toast;public class MainActivity extends AppCompatActivity {    private Handler handler;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        handler=new Handler();        handler.postDelayed(new Runnable() {            @Override            public void run() {                Intent intent=new Intent(MainActivity.this,Test.class);                startActivity(intent);            }        }, 3000);//3s后跳转    }}

最常用的还是处理线程的问题,通过一个线程传递一个信息,再在Handler中读取信息,根据信息来做出相应的动作

package com.example.sunny.handler;import android.content.Intent;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.Toast;public class MainActivity extends AppCompatActivity {    private Handler handler;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        handler=new Handler(){            @Override            public void handleMessage(Message msg) {                super.handleMessage(msg);                switch (msg.what){                    case 1:                        Toast.makeText(MainActivity.this, "线程通信", Toast.LENGTH_SHORT).show();                        break;                }            }        };        new Thread(){            @Override            public void run() {                super.run();                Message message=new Message();                message.what=1;                handler.sendMessage(message);            }        }.start();    }}

四、总结

事件处理机制很常用,也有很多技巧,运用灵活,多加练习

 

转载地址:http://syvrn.baihongyu.com/

你可能感兴趣的文章
学习笔记 | 传统企业互联网改革之道
查看>>
真正的高手,都有增长思维!(深度好文)
查看>>
推荐一款.NET Core开源爬虫神器:DotnetSpider
查看>>
Leansoft再发招贤令:面试官徐磊有话讲 | IDCF
查看>>
关于C# Span的一些实践
查看>>
linq 查询的结果会开辟新的内存吗?
查看>>
WPF开发的实用小工具 - 快捷悬浮菜单
查看>>
.Net orm 开源项目 FreeSql 2.0.0
查看>>
多线程并发如何高效实现生产者/消费者?
查看>>
学习搭建 Consul 服务发现与服务网格-有丰富的示例和图片
查看>>
IdentityServer4系列 | 简化模式
查看>>
如何在 C# 中使用 AutoMapper
查看>>
BCVP开发者说第4期:Remember.Core
查看>>
Entity Framework Core 5中实现批量更新、删除
查看>>
小试YARP
查看>>
如何使用 C# 中的 HashSet
查看>>
api-hook,更轻量的接口测试工具
查看>>
一个情怀引发的生产事故(续)
查看>>
做架构也得讲武德
查看>>
PHP大势已去,PHP宝藏可为我所用
查看>>