.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去获取点击了哪个键!实际上非常有趣...
本文转自ymnets博客园博客,原文链接:http://www.cnblogs.com/ymnets/p/3738617.html,如需转载请自行联系原作者
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
【我的Android进阶之旅】推荐一款视频转换GIF图片格式的转换工具(Video to GIF)
一、背景 最近想把一些Android Demo的运行效果图获取下来,但是一直使用真机进行调试,在电脑上不好截取一段gif动画。而之前使用模拟器的时候可以使用 GifCam 工具进行屏幕动画截取。GifCam 软件使用的截取的效果图如下所示: 关于GifCam的介绍可以看我之前的一篇博客,博客地址为: 我的Android进阶之旅——>介绍一款集录制与剪辑为一体的屏幕GIF 动画制作工具 GifCam (http://blog.csdn.net/ouyang_peng/article/details/12179665) 还好Android Studio 自带了屏幕录制功能,可以截取一段mp4视频保存下来,因此今天就推荐一款视频转换GIF图片格式的转换工具(Video to GIF),将录制的mp4视频转换为gif图片。 二、Video to GIF 介绍 Video to GIF是一款视频转换GIF图片格式的转换工具,软件界面友好,操作简单,支持目前所有流行的视频格式转换,软件能够高质量快速的进行转换,可以轻松查看高清动画及原始视频画面。 Video to GIF 主要特点 视频转换...
- 下一篇
.Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
我们知道资源被注册到R.java我们通过R.java就可以读取到界面中的组件。跟我们.net一样,通过ID来读取组件 知识点: 通过R.java读取组件 MainActivity.java通过findViewById方法查找组件 在Layout中用@string查找字符串,这个跟我们MVC中国际化基本相识,通过xml这种资源引用进行中文和英文切换 加入中文和英文本地化 双击fragment_main.xml设计视图,拖入一个Button和一个TextView,并双击进入xml代码 添加android:onClick,我也是靠猜的,程序代码都有相似性,特别是java与javascript。不过我们还是查找帮助文档比较好 输入android:onClick="SetTextView" 那么这段跟javascript一样,后台必须有SetTextView方法在监听这个事件 打开我们的MainActivity.java加入方法 public void SetTextView(View v) { TextView tv=(TextView)findViewById(R.id.textView1)...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS关闭SELinux安全模块
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7设置SWAP分区,小内存服务器的救世主