小猪的Android入门之路 Day 4 - part 1
小猪的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的更多相关文章
- 小猪的Android入门之路 Day 3 - part 3
小猪的Android入门之路 Day 3 - part 3 各种UI组件的学习 Part 3 本节引言: 在前面两个部分中我们对Android中一些比較经常使用的基本组件进行了一个了解, part 1 ...
- 小猪的Android入门之路 Day 7 part 2
小猪的Android入门之路 Day 7 part 2 Android的数据存储与訪问之--SharedPreferences(保存偏好參数) ---转载请注明出处:coder-pig 本节引言: 在 ...
- 小猪的Android入门之路 day 1
小猪的Android入门之路 Day 1 Android相关背景与开发环境的搭建 ------转载请注明出处:coder-pig 本节引言: 随着社会经济的发展,移动互联网的越来越热,手机APP开发显 ...
- Android学习之路——简易版微信为例(一)
这是“Android学习之路”系列文章的开篇,可能会让大家有些失望——这篇文章中我们不介绍简易版微信的实现(不过不是标题党哦,我会在后续博文中一步步实现这个应用程序的).这里主要是和广大园友们聊聊一个 ...
- Android入门教程之我见
真正的从安卓入门学习到实际工作也差不多一年时间了,也做了几个项目.在这期间经历了一开始学习Android的基本知识后仍旧无从下手,不知道如何开始开发一个app,到现在也开始学会注意Android架构的 ...
- Android入门之文件系统操作
Android入门之文件系统操作(二)文件操作相关指令 (转) (一)获取总根 File[] fileList=File.listRoots(); //返回fileList.length为1 // ...
- ❤️【Android精进之路-01】定计划,重行动来学Android吧❤️
您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦. Android精进之路第一篇,确定安卓学习计划. 干货满满,建议收藏,需要用到时常看看.小伙伴们如有问题及需要,欢迎踊跃留言哦~ ~ ~. 前言 ...
- ANDROID学习之路 转
版权声明:本文为 stormzhang 原创文章,可以随意转载,但必须在明确位置注明出处!!! 这篇博客背后的故事 一路走来很不容易,刚好知乎上被人邀请回答如何自学android编程, 就借这个机会在 ...
- Android入门(十二)SQLite事务、升级数据库
原文链接:http://www.orlion.ga/610/ 一.事务 SQLite支持事务,看一下Android如何使用事务:比如 Book表中的数据都已经很老了,现在准备全部废弃掉替换成新数据,可 ...
随机推荐
- linux下安装node.js
1.下载 wget http://nodejs.org/dist/v0.10.32/node-v0.10.32-linux-x64.tar.gz 2.解压 tar -xvf node-v0.10.32 ...
- 此三层非彼三层——MVC&UBD
学习了三年编程了,到如今这个阶段,開始接触架构,開始认识架构,怎样设计一个程序的结构,学名称"架构模式"(architectural pattern).个人经历告诉我这在编程中是一 ...
- struts2 与 OGNL 表达式,jsp中 利用ognl 在valuestack中取值
在Struts2中,一个请求在终于到达Action的方法之前,Action对象本身会被压入ValueStack(实际上就是放到ValueStack的CompoundRoot中),所以Action对象是 ...
- SharePoint 内容部署-PowerShell
1. 创建一个新的内容部署路径 New-SPContentDeploymentPath –Name "Marketing Internet Content" –SourceSPWe ...
- (读书笔记).NET大局观-.NET语言(1)
通用语言运行时 通用语言运行时被明确设计为支持多种语言,一般而言,建立于CLR之上的语言可以获得共同的良好处理.通过一个宏大的核心语义集,CLR还界定了一个以它为基础的典型编程语言的大体部分.例如对于 ...
- 【Struts2学习笔记(11)】对action的输入校验和XML配置方式实现对action的全部方法进行输入校验
在struts2中,我们能够实现对action的全部方法进行校验或者对action的指定方法进行校验. 对于输入校验struts2提供了两种实现方法: 1. 採用手工编写代码实现. 2. 基于XML配 ...
- cisco路由器IPSEC VPN配置(隧道模式)
拓扑如下: R1配置hostname R1enable password cisco crypto isakmp policy 1 #创建IKE协商策略,编号为1 encr 3des ...
- win8 远程桌面 你得凭证不工作
今天在在登录azure远程桌面时,一直提示你的凭证不工作, 按照网上各种教程都不行, 后来发现在win8中用户名结构中,需要加上本机电脑名比如:“win8\administrator”.
- 常用PHP中花括号使用规则详解
转自http://www.cnblogs.com/jayleke/archive/2011/11/08/2241609.html 1.简单句法规则(用花括号界定变量名,适用于PHP所有版本): $a ...
- JavaScript发展史,与JScript差别,引入方式,数据类型,命名规范,命名推荐,解决命名冲突
文件夹: 1.JavaScript发展史 2.JavaScript与JScript差别 3.JavaScript引入方式 4.JavaScript基本数据类型及布尔值 5.JavaScript命名规范 ...