Android onbackpressed实现返回键的拦截和弹窗流程分析
作者:知奕奕 发布时间:2021-09-11 09:07:22
前言
此文章主要解决拦截用户点击手机底部导航栏中的返回键时该事件的拦截;
此方法依然可以适用于fragment
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.sqlitedemo
import android.content.DialogInterface
import android.database.sqlite.SQLiteDatabase
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.KeyEvent
import android.view.MotionEvent
import androidx.activity.OnBackPressedCallback
import androidx.appcompat.app.AlertDialog
import com.zhiyiyi.sqlitedemo.databinding.ActivityNoteBinding
import com.zhiyiyi.sqlitedemo.utils.DBHelper
class 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()
}
}
来源:https://blog.csdn.net/delete_you/article/details/127822059


猜你喜欢
- 标识符和关键字标识符读音 biao zhi fu什么是标识符包、类、变量、方法…等等,只要是起名的地方,那个名字就是标
- 前端使用的是vue+elementui,这款系统只适合学习巩固SpringBoot+VUE,后面还要在这上面加校园公告、校园零食等功能,后期
- 前言感觉Jpa的动态构建查询不好使用,然后mybatis-plus没有动态构建表的功能,有没有可能使两者混合使用,利用Jpa自动建表的优势
- 本文实例讲述了Java使用synchronized实现互斥锁功能。分享给大家供大家参考,具体如下:代码package per.thread;
- 为什么需要将webView放在独立进程webView 加载网页的时候可能占用大量内存,导致应用程序OOM。webView 在访问结束的时候可
- 接着上一篇继续,老铁们1.检查数组的有序性给定一个整型数组, 判断是否该数组是有序的(升序) public static bo
- 删除本地仓库未下载完成的缓存文件(删除像图片显示这样以.lastUpdated结尾的文件)执行mvn -v确保maven命令可以正常执行执行
- Thread类相对于线程池中的线程,使用者有更多的控制权。该类允许创建前台线程,设置线程优先级等。Thread类的构造函数重载为接受Thre
- 引言在学习Java过程中,排序sort是我们常用的功能;在Java里,数组有Arrays.sort()可以排序,集合则是Collection
- 本文实例为大家分享了C语言实现学生成绩管理系统的具体代码,供大家参考,具体内容如下结构体版的学生成绩管理系统主要功能有按1 输入学生信息按2
- package org.itat.stax;import java.io.IOException;import java.io.InputS
- 状态机机制状态机机制是一种常用的解决状态扭转问题的方法,通过定义状态以及状态之间的转移规则来控制状态的流转。对于订单系统,我们可以使用状态机
- 我们通过一个完整的实例来实现课程信息管理功能的操作,包括查询、修改、删除课程信息的操作。为了简化实例,添加课程信息的操作直接在 SQL Se
- 本文实例讲述了C#中实现子类调用父类的方法,分享给大家供大家参考之用。具体方法如下:一、通过子类无参构造函数创建子类实例创建父类Person
- POM:<dependency> <groupId>com.baomidou</groupId&g
- 今天在用OpenCV实验Image Pyramid的时候发现一个奇怪的问题,就是利用C++函数imread读取图片的时候返回的结果总是空,而
- 本文实例为大家分享了Android简单使用PopupWindow的的具体代码,供大家参考,具体内容如下思路1.在res下面创建一个menu文
- 推荐教程:idea2021以下版本适用,通过无限重置试用持续激活:https://www.jb51.net/article/198343.h
- 在android开发中,有时候我们想获取手机的一些硬件信息,比如android手机的总内存和可用内存大小。这个该如何实现呢?通过读取文件&q
- Flutter开发过程中,Drawer控件的使用频率也是比较高的,其实有过移动端开发经验的人来说,Flutter中的Drawer控件就相当于