原文: .Net 转战 Android 4.4 日常笔记(8)--常见事件响应及实现方式

在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创建方法

.Net 转战 Android 4.4 日常笔记(8)--常见事件响应及实现方式_第1张图片

   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;            }        }    };

查看结果

.Net 转战 Android 4.4 日常笔记(8)--常见事件响应及实现方式_第2张图片.Net 转战 Android 4.4 日常笔记(8)--常见事件响应及实现方式_第3张图片

长按和点击事件存在产生的问题

如果我们一个事件同时绑定了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个事件触发了,但是我们貌似只要长按,在我们理解中,长按就是长按,单击就是单击)

.Net 转战 Android 4.4 日常笔记(8)--常见事件响应及实现方式_第4张图片

这时我们看看帮助文档怎么说

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;            }        });

可以看到鼠标按后在上面移动后松开的事件触发!

.Net 转战 Android 4.4 日常笔记(8)--常见事件响应及实现方式_第5张图片

再来看一个有趣的动作,可以移动的按钮,根据容器的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就是组件元素

.Net 转战 Android 4.4 日常笔记(8)--常见事件响应及实现方式_第6张图片

现在大力的移动手指吧!

焦点事件

焦点事件跟我们的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

.Net 转战 Android 4.4 日常笔记(8)--常见事件响应及实现方式_第7张图片

当然我们也可以根据keyCode去获取点击了哪个键!实际上非常有趣...

更多相关文章

  1. Android事件分发机制原理及源码分析
  2. Android事件分发-总结
  3. Android ListView 事件监听 || 关于ListView选中时显示的效果。
  4. Android(java)学习笔记113:Android编写代码调用Vibrator震动功能,按
  5. Android中的ListView实现图片文字和按钮
  6. android 加载已经安装的apk方式
  7. Android studio 点击按钮 改变viewtext 文字的颜色
  8. Android增加自定义监听事件
  9. android开关按钮,Switch,ToggleButton,RadioButton,CheckBox ,多种实

随机推荐

  1. android 执行monkey指令的方法
  2. 理解 Context.getSystemService 原理
  3. AndroidStudio修改生成的apk名称
  4. Android sp & sp
  5. Android 中onSaveInstanceState()解析
  6. android 基于ffmpeg将视频采集的nv21转h2
  7. android手电筒
  8. android input子系统--InputReader Event
  9. 修改Android中strings.xml文件
  10. Dagger2+Retrofit+RxJava