.Net 转战 Android 4.4 日常笔记(8)--常见事件响应及实现方式
在Andrioid开发中,常见的事件如下
- 单击事件 OnClickListener
- 长按事件 OnLongClickListener
- 滑动事件 OnTouchListenner
- 键盘事件 OnKeyListenner
- 焦点事件 setOnFoucsChangeListener
设置方式
1.动态设置(最常用的方式)
Button btn = (Button) findViewById(R.id.btnTest);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.i("Tip","按钮被点击了");
}
});
2.配置方式(仅限于Button的OnClick事件)
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Test1"
android:id="@+id/btnTest1"
android:layout_below="@+id/btnTest"
android:layout_centerHorizontal="true"
android:layout_marginTop="56dp"
android:onClick="Test1"/>
在拖入的控件加入 android:onClick="Test1" ,后台必须有Test1方法对应,在Test1按Alt+Enter创建方法

public void Test1(View view) {
//传入的View是当前的button
Button btn = (Button)view;
btn.setText("改变了按钮的文本");
Log.i("Tip","配置的按钮被点击了!");
}
3.可复用方式(这种方式适用于重复可复用代码)
首先在我们的MainActivity加入方法
private View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.i("Tip","监听到按钮点击!");
}
};
拖入3个按钮并设置ID分别为btnTest2,btnTest3,btnTest4
在onCreate方法中加入这3个按钮的事件。
Button btn2 = (Button) findViewById(R.id.btnTest2);
Button btn3 = (Button) findViewById(R.id.btnTest3);
Button btn4 = (Button) findViewById(R.id.btnTest4);
btn2.setOnClickListener(listener);
btn3.setOnClickListener(listener);
btn4.setOnClickListener(listener);
这样我们用了更少的代码获得更清晰的结构
接下来我们要在方法中判断是那个按钮点击了
private View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View view) {
//通过getId来获取触发的是那个按钮
switch(view.getId())
{
case
R.id.btnTest2: Log.i("Tip","点击按钮2!");
break;
case
R.id.btnTest3: Log.i("Tip","点击按钮3!");
break;
case
R.id.btnTest4: Log.i("Tip","点击按钮4!");
break;
}
}
};
查看结果


长按和点击事件存在产生的问题
如果我们一个事件同时绑定了OnClick事件和OnLongClick事件,会发生什么!
拖入一个button Id为btnTest5,并绑定2个事件
Button btn5 = (Button) findViewById(R.id.btnTest5);
btn5.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.i("Tip","按钮被点击了");
}
}); btn5.setOnLongClickListener(new View.OnLongClickListener(){
@Override
public boolean onLongClick(View view) {
Log.i("Tip","按钮被长按了了");
return false;
}
});
我们长按后松开按钮看看打印出什么(2个事件触发了,但是我们貌似只要长按,在我们理解中,长按就是长按,单击就是单击)

这时我们看看帮助文档怎么说
Returns
true if the callback consumed the long click, false otherwise.
大约理解到
onLongClick 返回 true时候会回调消耗这个事件不会往下传递,现在我们改下代码
btn5.setOnLongClickListener(new View.OnLongClickListener(){
@Override
public boolean onLongClick(View view) {
Log.i("Tip","按钮被长按了");
return true;
}
});
运行之后的点击只显示长按事件的触发
触摸事件
Touch事件由元事件组成action_up,action_down,action_move等等....
Button btn6 = (Button) findViewById(R.id.btnTest6);
//Touch事件由元事件组成action_up,action_down,action_move等等....
btn6.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
int event = motionEvent.getAction();
if(event==MotionEvent.ACTION_DOWN)
{
Log.i("Tip","被按下...");
}
else if(event==MotionEvent.ACTION_MOVE)
{
Log.i("Tip","被移动...");
}
else if(event==MotionEvent.ACTION_UP)
{
Log.i("Tip","被松开...");
}
return false;
}
});
可以看到鼠标按后在上面移动后松开的事件触发!

再来看一个有趣的动作,可以移动的按钮,根据容器的event获取 X和Y坐标给按钮
现在打开MainActivity.xml的给容器一个ID值
<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:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.ymnets.testtouchlistener.app.MainActivity"
android:id="@+id/myLayout" >
改变一下代码
ViewGroup viewGroup = (ViewGroup) findViewById(R.id.myLayout);
final Button btn = (Button)findViewById(R.id.button);
//Touch事件由元事件组成action_up,action_down,action_move等等....
viewGroup.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
int event = motionEvent.getAction();
if(event==MotionEvent.ACTION_MOVE)
{
btn.setX(motionEvent.getX());
btn.setY(motionEvent.getY());
Log.i("Tip","被移动...");
}
return true;
}
});
其中ViewGroup其实就是布局,View就是组件元素

现在大力的移动手指吧!
焦点事件
焦点事件跟我们的JS的焦点事件基本一个性质。
但是Android得到焦点和失去焦点都在同个方法内运行
随便拖一个TextBox在安卓里面叫EditText
输入事件代码
EditText editText = (EditText) findViewById(R.id.editText);
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean b) {
Log.i("Tip","有焦点了...");
}
});
当文本框得到和失去焦点时候都会出现日志
05-20 05:03:52.009 1165-1165/com.ymnets.testtouchlistener.app I/Tip﹕ 有焦点了...
键盘事件
设置我们文本框的键盘事件!
editText.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View view, int i, KeyEvent keyEvent) {
if(keyEvent.getAction()==KeyEvent.ACTION_UP) {
Log.i("Tip", i + "");
}
return false;
}
});
其中的i是keyCode,输出了keyCode

当然我们也可以根据keyCode去获取点击了哪个键!实际上非常有趣...
.Net 转战 Android 4.4 日常笔记(8)--常见事件响应及实现方式的更多相关文章
- .Net 转战 Android 4.4 日常笔记目录
.Net 转战 Android 4.4 日常笔记(1)--工具及环境搭建 .Net 转战 Android 4.4 日常笔记(2)--HelloWorld入门程序 .Net 转战 Android 4.4 ...
- .Net 转战 Android 4.4 日常笔记(1)--工具及环境搭建
闲来没事做,还是想再学习一门新的技术,无论何时Android开发比Web的开发工资应该高40%,我也建议大家面对移动开发,我比较喜欢学习最新版本的,我有java的基础,但是年久,已经淡忘,以零基础学习 ...
- .Net 转战 Android 4.4 日常笔记(10)--PullToRefresh下拉刷新使用
下拉刷新很多地方都用到了,新浪微博,微信,百度新闻 这里我们使用一个开源的库叫:PullToRefresh 开源地址:https://github.com/chenyoca/pull-to-refre ...
- .Net 转战 Android 4.4 日常笔记(10)--ADT集成环境更新SDK
今天下载了一份原来来参考,却发现SDK版本偏低我没有安装 用SDK Manager却一直更新不了出现 Failed to fetch URL https://dl-ssl.google.com/and ...
- .Net 转战 Android 4.4 日常笔记(9)--常用组件的使用方法[附源码]
经过两天的学习,把常用的组件都学习了一遍,并做成了App 学习可能真没有捷径,跟学习html有点类似,都是一个控件一个控件学习并使用,最后拼凑成一个系统 链接:http://pan.baidu.com ...
- .Net 转战 Android 4.4 日常笔记(7)--apk的打包与反编译
apk(android package)就是我们安卓系统的安装文件,可以在模拟器和手机中直接打开安装,从项目中打包apk有几种方式可取 一.最简单的方法(类似我们的winfrom) 只要我们调试或者运 ...
- .Net 转战 Android 4.4 日常笔记(6)--Android Studio DDMS用法
Android Studio DDMS与Eclipse DDMS大同小异,下面了解DDMS的使用 DDMS(Dalvik Debug Monitor Service )Dalvik调试监控服务 DDM ...
- .Net 转战 Android 4.4 日常笔记(5)--新软件Android Studio 0.5.8安装与配置及问题解决
说真心话,Eclipse跟我们.net的VS比起来就是屌丝比高富帅,一切都是那么的难用,速度慢得我无法忍受 于是想试试Google钦点的Android Studio IDE工具,这跟ADT一样也是一套 ...
- .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
我们知道资源被注册到R.java我们通过R.java就可以读取到界面中的组件.跟我们.net一样,通过ID来读取组件 知识点: 通过R.java读取组件 MainActivity.java通过find ...
随机推荐
- bzoj1927最小费用最大流
其实本来打算做最小费用最大流的题目前先来点模板题的,,,结果看到这道题二话不说(之前打太多了)敲了一个dinic,快写完了发现不对 我当时就这表情→ =_=你TM逗我 刚要删突然感觉dinic的模 ...
- servlet中文乱码问题
通过response对象向页面输出内容时遇到的乱码问题可分为两种情况 1.字节流 字节流输出时可以通过设置响应头"Content-Type"的值为"text/html;c ...
- MongoDB的简单操作(asp.net)
using System; using System.Collections.Generic; using System.Linq; using System.Web; using MongoDB.D ...
- Jenkins中构建Testcomplete项目的方法介绍
Jenkins的部署在上一篇随笔中已经和大家介绍了,下面我们介绍一下再Jenkins中构建testcomplete项目.我这里使用的是Testcomplete11,下面详细介绍一下构建步骤. 1.Je ...
- nodejs学习之加密
Nodejs中的加密是Crypto模块, 1.md5的使用 var crypto = require("crypto"); //创建 var md5 = crypto.create ...
- 回忆那些我们曾今铭记过的.NET重点知识
正如标题所说的那样,到底是那些.NET的知识点呢? 接下来就让我带着你们去了解这些知识点吧! 1.接口 2.索引器 3.FOREACH的本质 4.匿名内部类 5.运算符的重载 一.什么是接口? ...
- Hadoop 和 HDInsight:Windows Azure 中的大数据
世界的大数据包含一个庞大而充满活力的生态系统,但一个开放源码项目上面有这一切,那就是 Hadoop 的王朝. Hadoop 是事实上的标准的分布式的数据运算.Hadoop 提供了一个 MapReduc ...
- Scrum Guide - Scrum指南中文版
现在公司在使用敏捷开发模式进行日常的开发和管理工作,所以我看了下Ken Schwaber的<Scrum Guide>这本小册子,原本是英文的,这里提供中文的,以供日后复习和参考. Scru ...
- ASP.Net请求处理机制初步探索之旅 - Part 2 核心
开篇:上一篇我们了解了一个请求从客户端发出到服务端接收并转到ASP.Net处理入口的过程,这篇我们开始探索ASP.Net的核心处理部分,借助强大的反编译工具,我们会看到几个熟悉又陌生的名词(类):Ht ...
- A*寻路算法
对于初学者而言,A*寻路已经是个比较复杂的算法了,为了便于理解,本文降低了A*算法的难度,规定只能横竖(四方向)寻路,而无法直接走对角线,使得整个算法更好理解. 简而言之,A*寻路就是计算从起点经过该 ...