Android 中的监听和按键处理详情

目录
  • 各种监听
  • 按键处理
    • onKeyDown()
    • onBackPressed()
  • Fragment中监听Back返回键

各种监听

我们来练习下各种监听。我们在 TextView 上添加了触摸监听,在 Button 上添加了长按监听,在 Spinner 下拉框选项发生变化的时候添加了监听,在 ListView 选中选项时增加了监听。

xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#F08080"
        android:padding="10dp"
        android:text="触屏监听" />

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:elevation="1dp"
        android:text="长按监听" />

    <Spinner
        android:id="@+id/spinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#EED2EE"
        android:padding="20dp" />

    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#D1EEEE" />
</LinearLayout>

Activity

public class MainActivity extends AppCompatActivity {
    private TextView textview;
    private Button button;
    private Spinner spinner;
    private ListView listview;
    private String[] cities;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setData();//准备要在列表中要显示的数据
        setViews();//获得控件,并在列表中显示数据
        setListeners();//为控件设置监听器
    }

    private void setData() {
        cities = new String[]{"北京", "天津", "河北",
                "黑龙江", "吉林", "辽宁", "内蒙古",
                "新疆", "西藏", "江苏", "上海"
        };
    }

    private void setViews() {
        textview = findViewById(R.id.textView);
        button = findViewById(R.id.button);
        spinner = findViewById(R.id.spinner);
        listview = findViewById(R.id.listview);

        //列表和下拉菜单显示城市列表
        //一段神秘的代码...
        ArrayAdapter<String> adapter = null;
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, cities);
        listview.setAdapter(adapter);

        adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, cities);
        adapter.setDropDownViewResource(android.R.layout.simple_expandable_list_item_1);
        spinner.setAdapter(adapter);
    }

    private void setListeners() {
        textview.setOnTouchListener((view, motionEvent) -> {
            switch (motionEvent.getAction()) {
                //按下
                case MotionEvent.ACTION_DOWN:
                    Toast.makeText(MainActivity.this, "按下", Toast.LENGTH_SHORT).show();
                    break;
                //抬起
                case MotionEvent.ACTION_UP:
                    Toast.makeText(MainActivity.this, "抬起", Toast.LENGTH_SHORT).show();
                    break;
                //移动
                case MotionEvent.ACTION_MOVE:
                    //Toast.makeText(MainActivity.this, "移动", Toast.LENGTH_SHORT).show();
                    break;
            }
            return true;
        });

        button.setOnLongClickListener(view -> {
            Toast.makeText(MainActivity.this, "长按了按钮", Toast.LENGTH_SHORT).show();
            //返回布尔值true
            return true;
        });

        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                Toast.makeText(MainActivity.this, "下标" + i + "城市" + cities[i], Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
            }
        });

        listview.setOnItemClickListener((adapterView, view, i, l) -> Toast.makeText(MainActivity.this, "下标" + i + "城市" + cities[i], Toast.LENGTH_SHORT).show());
    }
}

按键处理

onKeyDown()

按键处理表现为使用 Android 设备时操作的物理按钮的响应的处理。

重写 onKey??() 方法可以处理按钮的事件,该系列方法的参数 int keyCode 表示按下的哪个键,可以匹配 keyEvent 类中的常量进行对比。

我们可以捕获 Back 键。原理是:当按下 BACK 键时,会被onKeyDown捕获,判断是 BACK 键,则执行相应方法。

新建一个测试项目,在 MainActivity 中增加如下代码:

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        //日志
        Log.d("ONKEYDOWN", "keyCode:" + keyCode);
        //判断其按下的是否为返回键(Back)
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            Toast.makeText(this, "连按2下退出应用程序", Toast.LENGTH_SHORT).show();
        }
        //按照默认方式处理
        return super.onKeyDown(keyCode, event);
    }

运行程序:

可以看到按下返回键时,退出了程序,同时输出日志

ONKEYDOWN: keyCode:4

由于最后执行了return super.onKeyDown(keyCode, event);,所以按照默认方式退出了

如果改为return false; 或 return true; 都不会退出程序。

栗子:连按2次退出应用程序的代码

public class MainActivity extends AppCompatActivity {
    private long lastBackDownTime;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        //日志
        Log.d("ONKEYDOWN", "keyCode:" + keyCode);
        //判断其按下的是否为返回键(Back)
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            //获取当前按下Back键的时间
            long currentBackDownTime = System.currentTimeMillis();
            //与上一次按下Back键的时间对比
            //如果时间差不超过1000ms,判定为连续按下,则退出
            //否则再次提示
            if (currentBackDownTime - lastBackDownTime < 1000) {
                finish();
            } else {
                Toast.makeText(this, "连按2下退出应用程序", Toast.LENGTH_SHORT).show();
                //如果没有退出,则记录本次按下Back键时间,作为下次时间参考
                lastBackDownTime = currentBackDownTime;
            }

            return true;
        }
        //按照默认方式处理
        return super.onKeyDown(keyCode, event);
    }
}

运行程序,当连续按两次返回键会退出程序,如果只按一次不会。

onBackPressed()

onBackPressed()这个方法就是专门用来监听 back 键事件的。所以可以用以下代码完成 按两次返回键退出程序 的功能。

@Override
    public void onBackPressed() {
        long currentBackDownTime = System.currentTimeMillis();
        if (currentBackDownTime - lastBackDownTime < 1000) {
            finish();
        } else {
            Toast.makeText(this, "连按2下退出应用程序", Toast.LENGTH_SHORT).show();
            lastBackDownTime = currentBackDownTime;
        }
        super.onBackPressed();
    }

Fragment中监听Back返回键

监听手机上的 Back 键可以在 Activity 中重写onBackPressed方法。

如果只有1个 Activity 管理多个 Fragment,每个 Fragment 点击 Back 键处理不同事件,可以在 Activity 中重写 onBackPressed 方法,然后区分不同 Fragment 即可。

因为我的 Fragment 用 tag 进行了区分,区分当前 tag 即可,代码如下:

@Override
public void onBackPressed() {
	if(currentTag.equals("xx")) {
		doSomething();
    } else {
        // handle by activity
        super.onBackPressed();
	}
}

到此这篇关于Android 中的监听和按键处理详情的文章就介绍到这了,更多相关Android 监听 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android App实现监听软键盘按键的三种方式

    前言: 我们在Android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的"Go"按键加载url页面:在点击搜索框的时候,点击右下角的search符号键可以进行搜索:或者在全部数据输入完毕后,点击右下角的"done"就马上进行下一步操作. 效果图: function 1: 重写Activity的dispatchKeyEvent(KeyEvent event)方法,在其中监听KeyEventKey.KEYCODE

  • 详解React Native监听Android回退按键与程序化退出应用

    详解React Native监听Android回退按键与程序化退出应用 前言 我们知道Android回退按键,会控制页面返回, 并且退出应用并非真正意义退出,仍在后台运行,所以在某些场景下需要监控android回退按键,那么在React Native中应该如何应用呢?我们具体来看看. BackAndroid 此模块用于监听硬件的back键操作. 看下具体代码: BackAndroid.addEventListener('hardwareBackPress', function() { if (!

  • 安卓(Android) 监听按键长按事件

    1,key -- 实体按键 现在手机物理按键越来越少 常见的有 KEYCODE_VOLUME_DOWN/UP KEYCODE_POWER KEYCODE_BACK KEYCODE_HOME KEYCODE_MENU 在一个activity 重载父类 的下面这三个方法来处理按键事件 public boolean onKeyDown(int keyCode, KeyEvent event): public boolean onKeyUp(int keyCode, KeyEvent event): p

  • Android 中的监听和按键处理详情

    目录 各种监听 按键处理 onKeyDown() onBackPressed() Fragment中监听Back返回键 各种监听 我们来练习下各种监听.我们在 TextView 上添加了触摸监听,在 Button 上添加了长按监听,在 Spinner 下拉框选项发生变化的时候添加了监听,在 ListView 选中选项时增加了监听. xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

  • Android中ScrollView监听滑动距离案例讲解

    需求:想实现像美团中列表下拉后出现悬浮窗的效果. 思路:首先对ScrollView进行滑动监听,然后在onScrollChanged()方法中获取到滑动的Y值,接着进行相关操作即可. 效果一如如下: 实现步骤: 1.自定义MyScrollView (1)重写onScrollChanged()获取Y值. (2)自定义滑动监听接口onScrollListener并公开此接口. public class MyScrollView extends ScrollView { private OnScrol

  • Android中实现监听ScrollView滑动事件

    时候我们需要监听ScroView的滑动情况,比如滑动了多少距离,是否滑到布局的顶部或者底部.可惜的是SDK并没有相应的方法,不过倒是提供了一个 复制代码 代码如下: protected void onScrollChanged(int x, int y, int oldx, int oldy) 方法,显然这个方法是不能被外界调用的,因此就需要把它暴露出去,方便使用.解决方式就是写一个接口, 复制代码 代码如下: package com.example.demo1;    public inter

  • android截图事件监听的原理与实现

    Android系统没有对用户截屏行为提供回调的api,所以我们只能走野路子来获取用户是否截屏了.一般大家都会采用如下两种方法 1.监听截屏图片所在目录变化(FileObserver) 2.监听媒体库的变化(ContentObserver) 上面两种方法均不是万能的,需要结合使用才能达到良好的效果,首先看看如何监控目录 在android中,我们可以通过FileObserver来监听目录变化,先来看看如何使用 private static final File DIRECTORY_PICTURES

  • Android 动态注册监听网络变化实例详解

    Android 动态注册监听网络变化实例详解 新建一个BroadcastTest项目,然后修改MainActivity中的代码,如下: public class MainActivity extends AppCompatActivity { private IntentFilter intentFilter; private NetworkChangeReceiver networkChangeReceiver; @Override protected void onCreate(Bundle

  • Android下载进度监听和通知的处理详解

    本文实例为大家分享了Android下载进度监听和通知的具体代码,供大家参考,具体内容如下 下载管理器 关于下载进度的监听,这个比较简单,以apk文件下载为例,需要处理3个回调函数,分别是: 1.下载中 2.下载成功 3.下载失败 因此对应的回调接口就有了: public interface DownloadCallback { /** * 下载成功 * @param file 目标文件 */ void onComplete(File file); /** * 下载失败 * @param e */

  • Android App内监听截图加二维码功能代码

    Android截屏功能是一个常用的功能,可以方便的用来分享或者发送给好友,本文介绍了如何实现app内截屏监控功能,当发现用户在我们的app内进行了截屏操作时,进行对图片的二次操作,例如添加二维码,公司logo等一系列*. 项目地址 测试截图: 截屏原理 android系统并没有提供截屏通知相关的API,需要我们自己利用系统能提供的相关特性变通实现.Android系统有一个媒体数据库,每拍一张照片,或使用系统截屏截取一张图片,都会把这张图片的详细信息加入到这个媒体数据库,并发出内容改变通知,我们可

  • Android编程实现监听EditText变化的方法

    本文实例讲述了Android编程实现监听EditText变化的方法.分享给大家供大家参考,具体如下: 监听EditText中的内容的变化.在EditText没有找到一个setOnxxxx的方法.百度了一下,原来在EditText中有一个方法addTextChangedListner(TextWatcher watcher)方法,用他可以时时监听EditText的内容变化.TextWatcher是一个接口类,所以必须实现TextWatcher里的抽象方法: 当EditText里面的内容有变化的时候

  • Android 使用ContentObserver监听数据库内容是否更改

    Android 使用ContentObserver监听数据库内容是否更改 ContentObserver--内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它.触发器分为表触发器.行触发器,相应地ContentObserver也分为"表"ContentObserver."行"ContentObserver,当然这是与它所

  • Android 7.0 监听网络变化的示例代码

    Android7.0前,Android系统前网络切换时,会发广播,业务只要监听广播即可. public class NetChangeReceiver extends BroadcastReceiver { private static final String ANDROID_NET_CHANGE_ACTION = "android.net.conn.CONNECTIVITY_CHANGE"; @Override public void onReceive(Context conte

随机推荐