小猪的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表中的数据都已经很老了,现在准备全部废弃掉替换成新数据,可 ...
随机推荐
- 每次调用fork()函数之后,父线程和创建出的子线程都是从fork()后开始执行
Linux下多少个"-"将被打印: 1 2 3 4 5 6 7 8 int main(void){ int i; for(i=0;i<4;i++){ fork() ...
- 更好的自动ssh登录
更好的自动ssh登录 解决~/.ssh/known_hosts 过期问题. bash + expect bash:ssh.sh #!/bin/bash help(){ echo "usage ...
- 8592 KMP算法
8592 KMP算法 时间限制:1000MS 内存限制:1000K 题型: 编程题 语言: 无限制 描写叙述 用KMP算法对主串和模式串进行模式匹配. 本题目给出部分代码.请补全内容. #inc ...
- WM_SYSCOMMAND消息命令整理 good
注意:1. 使用WM_SYSCOMMAND时,鼠标的一些消息可能会受到影响,比如不能响应MouseUp事件,可以在窗口中捕获WM_SYSCOMMAND消息,并判断消息的CommandType来判断消息 ...
- java学习笔记12--国际化
java学习笔记12--国际化 国际化的操作就是指一个程序可以同时适应多门语言,即:如果现在程序者是中国人,则会以中文为显示文字,如果现在程序的使用者是英国人,则会以英语为显示的文字,也就是说可以通过 ...
- 日交易41.9亿,B2B的魅力为何不输于B2C、C2C?
在最近两年的电子商务版图中,B2C和C2C可谓大放异彩,相比之下,B2B却显得颇为“低调”,当然,低调并不代表没有影响力,只不过,相比B2C和C2C面向数亿网民而言,B2B只针对企业和商家服务 ...
- M I S 开发与管理
今天是开学的第一天,很意外的一天没课.但是我知道还有很多事情在等待这我,不能懈怠!安排好计划,把重要不紧急的事情逐渐蚕食掉,切不可养虎为患,等拖到它变成重要紧急事件后,那就后悔莫及了. 下午看了看自考 ...
- POI数据下载器
偶尔用点儿POI数据,所以写了一个下载器.用到的东西还真不少. 功能点 +编写翻页脚本 +CSharp与JS交互 +POI数据转换json +CSharp的json序列化类 +CSharp读写json ...
- 杭州电ACM1098——Ignatius's puzzle
这个话题.简单的数学. 对于函数,f(x)=5*x^13+13*x^5+k*a*x,输入k,对于休闲x,一个数字的存在a,使f(x)是65可分. 对于休闲x. 因此,当x = 1时间,f(x) = 1 ...
- 线段树 [成段更新] HDU 1698 Just a Hook
成段更新,需要用到延迟标记(或者说懒惰标记),简单来说就是每次更新的时候不要更新到底,用延迟标记使得更新延迟到下次需要更新or询问到的时候. 此处建议在纸上模拟一遍. Problem Descript ...