zoukankan      html  css  js  c++  java
  • .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创建方法

       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去获取点击了哪个键!实际上非常有趣...

  • 相关阅读:
    推荐一个简洁优雅的博客系统,farbox
    flash从数据流判断图片格式防止xss攻击
    iBatis框架batch处理优化 (转)
    hadoop环境中误删除tmp文件夹的恢复
    Mysql04
    MapReduce中文翻译
    Big Table中文翻译
    GFS中文翻译
    HDFS读写流程
    两个网卡的设置
  • 原文地址:https://www.cnblogs.com/ymnets/p/3738617.html
Copyright © 2011-2022 走看看