我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android onbackpressed如何实现返回键的拦截和弹窗

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android onbackpressed如何实现返回键的拦截和弹窗

这篇“Android onbackpressed如何实现返回键的拦截和弹窗”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android onbackpressed如何实现返回键的拦截和弹窗”文章吧。

onBackPressed()

这是 activity 中自带的拦截返回的方法;

每当我们按下底部导航的返回键时,就会调用该事件,我们可以通过重写它来阻止 activity 的销毁

譬如下方代码,我们直接把 super 注释掉,那么点击返回键时就不会有任何反应,因为我们并没有针对性的进行响应的事件处理

override fun onBackPressed() {    // super.onBackPressed()}

onBackPressedDispatcher

fragment 没有提供 onBackPressed 方法,故大多数情况下使用 android 推荐的 onBackPressedDispatcher 来进行返回键的拦截操作;

接下来是一个拦截返回并弹窗,询问是否退出的一个小案例;

为便于大家理解,故直接使用 activity 而非 fragment;

首先使用属性委托 lazy,即懒加载的方式定义一个 onBackPressedDispatcher 变量

class NoteActivity : AppCompatActivity() {    private val dispatcher by lazy {        NoteActivity().onBackPressedDispatcher    }    override fun onCreate(savedInstanceState: Bundle?) {        ...    }}

接着在 oncreate 方法中注册 onBackPressedDispatcher

注册的方式即添加一个回调函数用处处理拦截时的动作,使用 addCallback

addCallback 有两个参数,第一个为上下文,第二个为 OnBackPressedCallback 函数方法(下面的代码使用了 lambda 的形式提高效率)

OnBackPressedCallback 函数接收一个参数,我们一般都填 true;

它还需要实现一个方法 handleOnBackPressed ,这里面就是处理对应实践的地方了

在 handleOnBackPressed 方法内:

  • 如果想阻止返回事件,那就什么都不做

  • 如果想允许返回事件,那就使用 finish,结束掉本 activity

override fun onCreate(savedInstanceState: Bundle?) {    ...    dispatcher.addCallback(        this,        object : OnBackPressedCallback(true) {            override fun handleOnBackPressed() {                // 构造一个AlertDialog,具体怎么用不细说                AlertDialog.Builder(this@NoteActivity).apply {                    setTitle("Oops!")                    setMessage("请写上一个标题奥,不然咱没法保存")                    setIcon(R.drawable.ic_info)                    // 点击了确认按钮,直接使用finish销毁本activity                    setPositiveButton("直接退出") { dialog, which ->                        finish()                    }                    // 点了否定,就啥都不做,即不处理返回事件,那自然就不会销毁了                    setNegativeButton("我再想想", null)                }.show()            }        }    )}

最后,在 onBackPressed 中触发 onBackPressedDispatcher (因为返回键点击事件都由 onBackPressed 所拦截,onBackPressedDispatcher 仅仅是充当了一个助手的作用)

注意删掉或者注释原来的的 super,否则你点返回键就直接退出了,那就前功尽弃了!!!

override fun onBackPressed() {    dispatcher.onBackPressed()}

全部代码展示:

package com.zhiyiyi.sqlitedemoimport android.content.DialogInterfaceimport android.database.sqlite.SQLiteDatabaseimport androidx.appcompat.app.AppCompatActivityimport android.os.Bundleimport android.view.KeyEventimport android.view.MotionEventimport androidx.activity.OnBackPressedCallbackimport androidx.appcompat.app.AlertDialogimport com.zhiyiyi.sqlitedemo.databinding.ActivityNoteBindingimport com.zhiyiyi.sqlitedemo.utils.DBHelperclass NoteActivity : AppCompatActivity() {    private lateinit var binding: ActivityNoteBinding    // 懒加载    private val dispatcher by lazy {        NoteActivity().onBackPressedDispatcher    }    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        binding = ActivityNoteBinding.inflate(layoutInflater)        setContentView(binding.root)        // 注册回调事件        dispatcher.addCallback(            this,            object : OnBackPressedCallback(true) {                override fun handleOnBackPressed() {                    AlertDialog.Builder(this@NoteActivity).apply {                        setTitle("Oops!")                        setMessage("请写上一个标题奥,不然咱没法保存")                        setIcon(R.drawable.ic_info)                        setPositiveButton("直接退出") { dialog, which ->                            finish()                        }                        setNegativeButton("我再想想", null)                    }.show()                }            }        )    }    // 检测返回键点击事件    override fun onBackPressed() {        dispatcher.onBackPressed()    }}

以上就是关于“Android onbackpressed如何实现返回键的拦截和弹窗”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android onbackpressed如何实现返回键的拦截和弹窗

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android onbackpressed如何实现返回键的拦截和弹窗

这篇“Android onbackpressed如何实现返回键的拦截和弹窗”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“An
2023-07-04

Androidonbackpressed实现返回键的拦截和弹窗流程分析

很多网友不明白如何在Android平台上捕获Back键的事件,Back键是手机上的后退键,一般的软件不捕获相关信息可能导致你的程序被切换到后台,而回到桌面的尴尬情况,在Android上有两种方法来获取该按钮的事件
2023-01-04

React Native之如何实现Android的返回键BackAndroid

这篇文章主要介绍React Native之如何实现Android的返回键BackAndroid,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!代码:// BackAndroidTool // 功能: "安卓手机上的返回
2023-05-30

android io.socket如何拦截所有监听事件实现和服务器端anything一样的事件

重写OkHttpClientclass MyOkHttpClient extends OkHttpClient {@Overridepublic WebSocket newWebSocket(Request request, final W
2022-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录