在Andrioid开发中,常见的事件如下

  1. 单击事件 OnClickListener
  2. 长按事件 OnLongClickListener
  3. 滑动事件 OnTouchListenner
  4. 键盘事件 OnKeyListenner
  5. 焦点事件 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)--常见事件响应及实现方式的更多相关文章

  1. .Net 转战 Android 4.4 日常笔记目录

    .Net 转战 Android 4.4 日常笔记(1)--工具及环境搭建 .Net 转战 Android 4.4 日常笔记(2)--HelloWorld入门程序 .Net 转战 Android 4.4 ...

  2. .Net 转战 Android 4.4 日常笔记(1)--工具及环境搭建

    闲来没事做,还是想再学习一门新的技术,无论何时Android开发比Web的开发工资应该高40%,我也建议大家面对移动开发,我比较喜欢学习最新版本的,我有java的基础,但是年久,已经淡忘,以零基础学习 ...

  3. .Net 转战 Android 4.4 日常笔记(10)--PullToRefresh下拉刷新使用

    下拉刷新很多地方都用到了,新浪微博,微信,百度新闻 这里我们使用一个开源的库叫:PullToRefresh 开源地址:https://github.com/chenyoca/pull-to-refre ...

  4. .Net 转战 Android 4.4 日常笔记(10)--ADT集成环境更新SDK

    今天下载了一份原来来参考,却发现SDK版本偏低我没有安装 用SDK Manager却一直更新不了出现 Failed to fetch URL https://dl-ssl.google.com/and ...

  5. .Net 转战 Android 4.4 日常笔记(9)--常用组件的使用方法[附源码]

    经过两天的学习,把常用的组件都学习了一遍,并做成了App 学习可能真没有捷径,跟学习html有点类似,都是一个控件一个控件学习并使用,最后拼凑成一个系统 链接:http://pan.baidu.com ...

  6. .Net 转战 Android 4.4 日常笔记(7)--apk的打包与反编译

    apk(android package)就是我们安卓系统的安装文件,可以在模拟器和手机中直接打开安装,从项目中打包apk有几种方式可取 一.最简单的方法(类似我们的winfrom) 只要我们调试或者运 ...

  7. .Net 转战 Android 4.4 日常笔记(6)--Android Studio DDMS用法

    Android Studio DDMS与Eclipse DDMS大同小异,下面了解DDMS的使用 DDMS(Dalvik Debug Monitor Service )Dalvik调试监控服务 DDM ...

  8. .Net 转战 Android 4.4 日常笔记(5)--新软件Android Studio 0.5.8安装与配置及问题解决

    说真心话,Eclipse跟我们.net的VS比起来就是屌丝比高富帅,一切都是那么的难用,速度慢得我无法忍受 于是想试试Google钦点的Android Studio IDE工具,这跟ADT一样也是一套 ...

  9. .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化

    我们知道资源被注册到R.java我们通过R.java就可以读取到界面中的组件.跟我们.net一样,通过ID来读取组件 知识点: 通过R.java读取组件 MainActivity.java通过find ...

随机推荐

  1. centos 7 安装和配置vncserver

    前期准备: 关闭防火墙,centos的防火墙是firewalld,关闭防火墙的命令 systemctl stop firewalld.service 关闭enforce setenforce 0 ce ...

  2. 第一个Mac shell 小脚本

    大多数程序员都喜欢偷懒的,我也不例外.相信好多Android开发的coder 在网络http请求方面,会浪费很多时间在接口调试这里..有时候,自己写了一个小测试,行还好,不行的话,还要跟写后台的哥们一 ...

  3. elasticsearch一些常用的配置

    配置了解 cluster #配置下集群的名称 cluster.name: my-application

  4. win32进程名查找进程PID

    1. #include <Psapi.h> #pragma comment(lib, "Psapi.lib") DWORD GetProcIDFromName(LPCT ...

  5. WEB前端工程师(实践)制作天气预报难度:简单

    需要准备:jQuery Bootstrap 天气预报API(本文中使用API可能会失效请灵活运用) CSS样式可以你自己去写这里只提出jQuery 请求数据和解析JSON数据 { "resu ...

  6. 在发送ajax请求时加时间戳或者随机数去除js缓存

    在发送ajax请求的时候,为了保证每次的都与服务器交互,就要传递一个参数每次都不一样,这里就用了时间戳 大家在系统开发中都可能会在js中用到ajax或者dwr,因为IE的缓存,使得我们在填入相同的值的 ...

  7. 提取bmp图片的颜色信息,可直接framebuffer显示(c版本与python版本)

    稍微了解了下linux的framebuffer,这是一种很简单的显示接口,直接写入像素信息即可 配置好的内核,会有/dev/fbn 的接口,于是想能否提前生成一个文件,比如logo.fb,里面仅包含像 ...

  8. 各种android应用模仿源码

    V2EX的非官方Android客户端,极力遵循Material Design风格 下载 湘潭大学三翼校园"四季电台" Android客户端   下载   高仿煎蛋客户端    下载 ...

  9. MySQL的特点

    MySQL的特点 CPU特点 内存特点 磁盘特点 分析

  10. SQL Server2016 原生支持JSON

    SQL Server2016 原生支持JSON SQL Server 2005 开始支持 XML 数据类型,提供原生的 XML数据类型.XML 索引以及各种管理 XML 或输出 XML 格式的函数. ...