小猪的Android入门之路 Day 4 - part 1

Android事件处理机制之——基于监听的事件处理机制

本节引言:

在開始本个章节前,我们先回想下,如今我们已经知道了android的一些相关背景,一些经常使用的UI组件,

六大布局,如今的我们已经能够做出一个简单的app界面了,下一步就是逻辑与业务的实现了;在前面

的样例中我们以前看到过setXXXListener这些东东,这个就是android 的事件处理,而这种方法是基于监听的

Android为我们提供了两套功能强大的事件处理机制:

①基于监听的事件处理机制

②基于回调的事件处理机制

我们将会分成几个部分来解说Android的事件处理机制,而在这一part中我们会具体地解析

基于监听的事件处理机制!

本节学习路线图:

正文:

基于监听的时间处理机制模型:

流程模型图:

文字表述:

事件监听机制中由事件源,事件,事件监听器三类对象组成

处理流程:

step 1:为某个事件源(组件)设置一个监听器,用于监听用户操作

step 2:用户的操作,触发了事件源的监听器

step 3:生成了相应的事件对象

step 4:将这个事件源对象作为參数传给事件监听器

step 5:事件监听器对事件对象进行推断,运行相应的事件处理器(相应事件的处理方法)

归纳:

事件监听机制是一种委派式的事件处理机制,事件源(组件)事件处理托付给事件监听器

当事件源发生指定事件时,就通知指定事件监听器,运行对应的操作

监听机制的使用形式:

这里演示的是一个简单的button点击,提示Toast信息的程序

可是使用不同的形式来实现:

效果图:

不同实现:

①直接用匿名内部类

平时最经常使用的一种:直接setXxxListener后,重写里面的方法就可以;

一般是暂时使用一次,复用性不高!

代码:

MainActivity.java

package com.jay.example.innerlisten;  

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import android.app.Activity; public class MainActivity extends Activity { private Button btnshow; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); btnshow = (Button) findViewById(R.id.btnshow);
btnshow.setOnClickListener(new OnClickListener() {
//重写点击事件的处理方法onClick()
@Override
public void onClick(View v) {
//显示Toast信息
Toast.makeText(getApplicationContext(), "你点击了button", Toast.LENGTH_SHORT).show();
}
});
}
}

②使用内部类

和上面的匿名内部类不同哦!

使用长处:能够在该类中进行复用,可直接訪问外部类的全部界面组件!

代码:

MainActivity.java

package com.jay.example.innerlisten;  

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import android.app.Activity; public class MainActivity extends Activity { private Button btnshow; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); btnshow = (Button) findViewById(R.id.btnshow);
//直接new一个内部类对象作为參数
btnshow.setOnClickListener(new BtnClickListener()); } //定义一个内部类,实现View.OnClickListener接口,并重写onClick()方法
class BtnClickListener implements View.OnClickListener
{
@Override
public void onClick(View v) { Toast.makeText(getApplicationContext(), "button被点击了", Toast.LENGTH_SHORT).show();
} }
}

③使用外部类

就是另外创建一个处理事件的Java文件,这样的形式用的比較少!

由于外部类不能直接訪问用户界面类中的组件,要通过构造方法将组件传入使用;

这样导致的结果就是代码不够简洁!

ps:为了演示传參,这里用TextView取代Toast提示!

代码:

MyClick.java

package com.jay.example.innerlisten;  

import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView; public class MyClick implements OnClickListener { private TextView textshow;
//把文本框作为參数传入
public MyClick(TextView txt)
{
textshow = txt;
} @Override
public void onClick(View v) {
//点击后设置文本框显示的文字
textshow.setText("点击了button!");
} }

MainActivity.java

package com.jay.example.innerlisten;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
import android.app.Activity; public class MainActivity extends Activity { private Button btnshow;
private TextView txtshow; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); btnshow = (Button) findViewById(R.id.btnshow);
txtshow = (TextView) findViewById(R.id.textshow);
//直接new一个外部类,并把TextView作为參数传入
btnshow.setOnClickListener(new MyClick(txtshow)); }
}

④直接使用Activity作为事件监听器

仅仅须要让Activity类实现XxxListener事件监听接口,在Activity中定义重写相应的事件处理器方法

eg:Actitity实现了OnClickListener接口,重写了onClick(view)方法

在为某些组建加入该事件监听对象时,直接setXxx.Listener(this)就可以

还是一開始的那个布局效果;

代码:

MainActivity.java

package com.jay.example.innerlisten;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import android.app.Activity; //让Activity方法实现OnClickListener接口
public class MainActivity extends Activity implements OnClickListener{ private Button btnshow; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); btnshow = (Button) findViewById(R.id.btnshow);
//直接写个this
btnshow.setOnClickListener(this); } //重写接口中的抽象方法
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), "点击了button", Toast.LENGTH_SHORT).show();
}
}

⑤直接绑定到标签:

就是直接在xml布局文件里相应得Activity中定义一个事件处理方法

eg:public void myClick(View source)   source相应事件源(组件)

接着布局文件里相应要触发事件的组建,设置一个属性:onclick = "myclick"就可以

相同是哪个点击后提示toast信息的样例:

代码:

MainActivity.java

package com.jay.example.caller;  

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} //自己定义一个方法,传入一个view组件作为參数
public void myclick(View source)
{
Toast.makeText(getApplicationContext(), "button被点击了", Toast.LENGTH_SHORT).show();
}
}

main.xml布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="button"
android:onClick="myclick"
/> </LinearLayout>

小猪的Android入门之路 Day 4 - part 1的更多相关文章

  1. 小猪的Android入门之路 Day 3 - part 3

    小猪的Android入门之路 Day 3 - part 3 各种UI组件的学习 Part 3 本节引言: 在前面两个部分中我们对Android中一些比較经常使用的基本组件进行了一个了解, part 1 ...

  2. 小猪的Android入门之路 Day 7 part 2

    小猪的Android入门之路 Day 7 part 2 Android的数据存储与訪问之--SharedPreferences(保存偏好參数) ---转载请注明出处:coder-pig 本节引言: 在 ...

  3. 小猪的Android入门之路 day 1

    小猪的Android入门之路 Day 1 Android相关背景与开发环境的搭建 ------转载请注明出处:coder-pig 本节引言: 随着社会经济的发展,移动互联网的越来越热,手机APP开发显 ...

  4. Android学习之路——简易版微信为例(一)

    这是“Android学习之路”系列文章的开篇,可能会让大家有些失望——这篇文章中我们不介绍简易版微信的实现(不过不是标题党哦,我会在后续博文中一步步实现这个应用程序的).这里主要是和广大园友们聊聊一个 ...

  5. Android入门教程之我见

    真正的从安卓入门学习到实际工作也差不多一年时间了,也做了几个项目.在这期间经历了一开始学习Android的基本知识后仍旧无从下手,不知道如何开始开发一个app,到现在也开始学会注意Android架构的 ...

  6. Android入门之文件系统操作

    Android入门之文件系统操作(二)文件操作相关指令 (转)   (一)获取总根 File[] fileList=File.listRoots(); //返回fileList.length为1 // ...

  7. ❤️【Android精进之路-01】定计划,重行动来学Android吧❤️

    您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦. Android精进之路第一篇,确定安卓学习计划. 干货满满,建议收藏,需要用到时常看看.小伙伴们如有问题及需要,欢迎踊跃留言哦~ ~ ~. 前言 ...

  8. ANDROID学习之路 转

    版权声明:本文为 stormzhang 原创文章,可以随意转载,但必须在明确位置注明出处!!! 这篇博客背后的故事 一路走来很不容易,刚好知乎上被人邀请回答如何自学android编程, 就借这个机会在 ...

  9. Android入门(十二)SQLite事务、升级数据库

    原文链接:http://www.orlion.ga/610/ 一.事务 SQLite支持事务,看一下Android如何使用事务:比如 Book表中的数据都已经很老了,现在准备全部废弃掉替换成新数据,可 ...

随机推荐

  1. MySQL中同一时候存在创建和上次更新时间戳字段解决方法浅析

    在写这篇文章之前.明白我的MySQL版本号. mysql> SELECT VERSION(); +------------+ | VERSION() | +------------+ | 5.5 ...

  2. Java深入解析读书笔记(一)

    1. goto,const为java的两个保留关键字,无任何应用语法.因此从不使用.   goto 使用循环标签:if,break out,here实现goto的功能. 2. 标识符:可由字母数字下划 ...

  3. Hangfire Highlighter Tutorial

    Hangfire Highlighter Tutorial Hangfire是一个开源且商业免费使用的工具函数库.可以让你非常容易地在ASP.NET应用(也可以不在ASP.NET应用)中执行多种类型的 ...

  4. 注册Dev的帮助文件

    Download the CHM files from… Code: https://www.devexpress.com/Support/Documentation/download.xml?pla ...

  5. Indy的TCPServer到底能支持多少个连接

    最近一个项目,最开始使用IdTcpServer,在大压力测试的时候,只连接了800个多一点的客户端(每个客户端连接上之后每秒钟发送一个几十字节的报文,服务器应答).但是持续的时间不会超过10分钟,服务 ...

  6. apk应用的反编译和源代码的生成

    对于反编译一直持有无所谓有或无的态度.经过昨天一下午的尝试,也有了点心得和体会: 先给大家看看编译的过程和我们反编译的过程概图吧: 例如以下是反编译工具的根文件夹结构: 三个目录也实际上是下面三个步骤 ...

  7. MySql 链接url 参数详解

    最近 整理了一下网上关于MySql 链接url 参数的设置,有不正确的地方希望大家多多指教: mysql JDBC URL格式如下: jdbc:mysql://[host:port],[host:po ...

  8. HDU 4284 Travel

    据说是TSP经典问题...可以用状态压缩做.但是看到数据量,就厚着脸皮上搜索了...先floyd预处理每对点间的最小消费,然后只考虑要去的城市就可以了,这样的话城市数最多16个...当时就暴搜了... ...

  9. HDU1035深度搜索

    /* HDU1035 意甲冠军: 给定一个字符矩阵,N S W E分别代表向上,下,剩下,进 模拟搜索,推断: 若能走出字符矩阵.则Yes,输出步数 若走不出矩阵,那么必然有圈存在,必然在矩阵中存在一 ...

  10. BZOJ 1367([Baltic2004]sequence-左偏树+中位数贪心)

    1367: [Baltic2004]sequence Time Limit: 20 Sec   Memory Limit: 64 MB Submit: 521   Solved: 159 [ Subm ...