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

本文转自ymnets博客园博客,原文链接:http://www.cnblogs.com/ymnets/p/3738617.html,如需转载请自行联系原作者

相关文章
|
3月前
|
Java Android开发 UED
🧠Android多线程与异步编程实战!告别卡顿,让应用响应如丝般顺滑!🧵
【7月更文挑战第28天】在Android开发中,确保UI流畅性至关重要。多线程与异步编程技术可将耗时操作移至后台,避免阻塞主线程。我们通常采用`Thread`类、`Handler`与`Looper`、`AsyncTask`及`ExecutorService`等进行多线程编程。
52 2
|
15天前
|
Java Android开发 UED
🧠Android多线程与异步编程实战!告别卡顿,让应用响应如丝般顺滑!🧵
在Android开发中,为应对复杂应用场景和繁重计算任务,多线程与异步编程成为保证UI流畅性的关键。本文将介绍Android中的多线程基础,包括Thread、Handler、Looper、AsyncTask及ExecutorService等,并通过示例代码展示其实用性。AsyncTask适用于简单后台操作,而ExecutorService则能更好地管理复杂并发任务。合理运用这些技术,可显著提升应用性能和用户体验,避免内存泄漏和线程安全问题,确保UI更新顺畅。
36 5
|
2月前
|
JavaScript 前端开发 Java
FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
IT寒冬使APP开发门槛提升,安卓程序员需转型。选项包括:深化Android开发,跟进Google新技术如Kotlin、Jetpack、Flutter及Compose;研究Android底层框架,掌握AOSP;转型Java后端开发,学习Spring Boot等框架;拓展大前端技能,掌握JavaScript、Node.js、Vue.js及特定框架如微信小程序、HarmonyOS;或转向C/C++底层开发,通过音视频项目如FFmpeg积累经验。每条路径都有相应的书籍和技术栈推荐,助你顺利过渡。
45 3
FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
|
2月前
|
Java Android开发
全志 Android 11:实现响应全局按键
本文介绍了在全志平台Android 11上实现响应全局按键的方法,通过修改`TvWindowManager.java`来全局拦截特定的热键事件,并在`FocusActivity`中处理这些事件以启动调焦界面和控制步进电机调整焦距。
27 2
|
2月前
|
JSON 开发框架 JavaScript
【Azure Developer】使用.Net Core解析JSON的笔记
【Azure Developer】使用.Net Core解析JSON的笔记
|
2月前
|
XML Android开发 UED
"掌握安卓开发新境界:深度解析AndroidManifest.xml中的Intent-filter配置,让你的App轻松响应scheme_url,开启无限交互可能!"
【8月更文挑战第2天】在安卓开发中,scheme_url 通过在`AndroidManifest.xml`中配置`Intent-filter`,使应用能响应特定URL启动或执行操作。基本配置下,应用可通过定义特定URL模式的`Intent-filter`响应相应链接。
90 12
|
2月前
|
编解码 安全 Ubuntu
Android Selinux 问题处理笔记
这篇文章是关于处理Android系统中SELinux权限问题的笔记,介绍了如何通过分析SELinux拒绝的日志、修改SELinux策略文件,并重新编译部署来解决权限问题,同时提供了一些SELinux的背景知识和实用工具。
38 0
|
2月前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
很多文章都介绍了FTPClient如何连接ftp服务器,但却很少有人说如何连接一台开了SSL认证的ftp服务器,现在代码来了。
75 2
|
2月前
|
JSON Android开发 数据格式
Android项目架构设计问题之实现交互响应的结构化处理如何解决
Android项目架构设计问题之实现交互响应的结构化处理如何解决
14 0
|
2月前
|
Android开发
解决Android、Flutter编译时Gradle报错:javax.net.ssl.SSLException: Connection reset
解决Android、Flutter编译时Gradle报错:javax.net.ssl.SSLException: Connection reset
174 0
下一篇
无影云桌面