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

 更新时间:2022年08月18日 10:30:07   作者:奔跑吧鸡翅  
这篇文章主要介绍了Android 中的监听和按键处理详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

各种监听

我们来练习下各种监听。我们在 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 监听 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android自定义ViewPager实例

    Android自定义ViewPager实例

    这篇文章主要介绍了Android自定义ViewPager的方法,结合完整实例形式分析了Android基于ViewGroup类自定义ViewPager的具体实现技巧,需要的朋友可以参考下
    2016-02-02
  • Android布局之TableLayout表格布局

    Android布局之TableLayout表格布局

    Tablelayout类以行和列的形式对控件进行管理,每一行为一个TableRow对象,或一个View控件。当为TableRow对象时,可在TableRow下添加子控件,默认情况下,每个子控件占据一列。 当为View时,该View将独占一行
    2015-12-12
  • android实现百度地图自定义弹出窗口功能

    android实现百度地图自定义弹出窗口功能

    这篇文章主要介绍了android实现百度地图自定义弹出窗口的功能,大家参考使用吧
    2013-11-11
  • android的UDP编程实例

    android的UDP编程实例

    android的UDP编程实例和注意事项。
    2013-11-11
  • Android中的windowSoftInputMode属性详解

    Android中的windowSoftInputMode属性详解

    这篇文章主要介绍了Android中的windowSoftInputMode属性详解,本文对windowSoftInputMode的9个属性做了详细总结,需要的朋友可以参考下
    2014-10-10
  • Android实现listview滑动时渐隐渐现顶部栏实例代码

    Android实现listview滑动时渐隐渐现顶部栏实例代码

    android中实现listview滑动时渐隐渐现顶部栏只是在获取listview的滑动距离上可能没法直接获取,需要动态的去计算。感兴趣的朋友一起看看吧
    2016-10-10
  • Android抽屉布局DrawerLayout的简单使用

    Android抽屉布局DrawerLayout的简单使用

    这篇文章主要为大家详细介绍了Android抽屉布局DrawerLayout的简单使用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • AndroidStudio实现微信界面设计

    AndroidStudio实现微信界面设计

    这篇文章带你通过Androidstudio来实现微信的基础界面,微信的界面主要包含了主页、通讯录、发现以及我的账号功能区,下文包含了整个开发过程,以及解决该问题的过程及思路并提供了源码
    2021-10-10
  • 安卓(Android)开发之自定义饼状图

    安卓(Android)开发之自定义饼状图

    饼状图制作起来其实很简单,但是制作东西最重要的不是制作结果,而是制作思路。 相信小编贴上代码大家一看就立刻明白了,下面咱们来了解一下制作思路。
    2016-08-08
  • Android自定义View实现绘制水波浪温度刻度表

    Android自定义View实现绘制水波浪温度刻度表

    这篇文章主要为大家详细介绍了Android如何利用自定义View实现一个水波浪温度刻度表,文中的示例代码讲解详细,感兴趣的小伙伴可以尝试一下
    2022-11-11

最新评论