.Net 转战 Android 4.4 日常笔记(8)--常见事件响应及实现方式
在Andrioid开发中,常见的事件如下
- 单击事件 OnClickListener
- 长按事件 OnLongClickListener
- 滑动事件 OnTouchListenner
- 键盘事件 OnKeyListenner
- 焦点事件 setOnFoucsChangeListener
设置方式
1.动态设置(最常用的方式)
Button btn = (Button) findViewById(R.id.btnTest);btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Log.i("Tip","按钮被点击了");}});
2.配置方式(仅限于Button的OnClick事件)
<Buttonandroid: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是当前的buttonButton btn = (Button)view;btn.setText("改变了按钮的文本");Log.i("Tip","配置的按钮被点击了!");}
3.可复用方式(这种方式适用于重复可复用代码)
首先在我们的MainActivity加入方法
private View.OnClickListener listener = new View.OnClickListener() {@Overridepublic 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() {@Overridepublic void onClick(View view) {//通过getId来获取触发的是那个按钮switch(view.getId()){caseR.id.btnTest2: Log.i("Tip","点击按钮2!");break;caseR.id.btnTest3: Log.i("Tip","点击按钮3!");break;caseR.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() {@Overridepublic void onClick(View view) {Log.i("Tip","按钮被点击了");}});btn5.setOnLongClickListener(new View.OnLongClickListener(){@Overridepublic 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(){@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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,如需转载请自行联系原作者
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
