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

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

前言

此文章主要解决拦截用户点击手机底部导航栏中的返回键时该事件的拦截;

此方法依然可以适用于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()
    }
}

到此这篇关于Android onbackpressed实现返回键的拦截和弹窗流程分析的文章就介绍到这了,更多相关Android onbackpressed内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android开发中Eclipse报错及对应处理方法总结

    Android开发中Eclipse报错及对应处理方法总结

    这篇文章主要介绍了Android开发中Eclipse报错及对应处理方法,实例汇总了使用eclipse开发Android项目过程中常见的错误提示及对应的处理技巧,需要的朋友可以参考下
    2015-12-12
  • Android获取设备传感器的方法

    Android获取设备传感器的方法

    这篇文章主要为大家详细介绍了Android获取设备传感器的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • Android学习教程之动态GridView控件使用(6)

    Android学习教程之动态GridView控件使用(6)

    这篇文章主要为大家详细介绍了Android动态GridView控件的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Android如何判断一个点在不在多边形区域内

    Android如何判断一个点在不在多边形区域内

    这篇文章主要为大家详细介绍了Android判断一个点在不在多边形区域内的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • 详解Android 消息处理机制

    详解Android 消息处理机制

    这篇文章主要介绍了Android 消息处理机制的相关资料,帮助大家更好的进行Android开发,感兴趣的朋友可以了解下
    2020-10-10
  • Android自定义PopupWindow小案例

    Android自定义PopupWindow小案例

    这篇文章主要为大家详细介绍了Android自定义PopupWindow小案例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Android自定义View之渐变色折线图的实现

    Android自定义View之渐变色折线图的实现

    折线图的实现方法在github上有很多开源的程序,但是对于初学者来讲,简单一点的教程可能更容易入门,下面这篇文章主要给大家介绍了关于Android自定义View之渐变色折线图的相关资料,需要的朋友可以参考下
    2022-04-04
  • Android中Dialog自定义上下文花式菜单

    Android中Dialog自定义上下文花式菜单

    这篇文章主要为大家详细介绍了Android中Dialog自定义上下文花式菜单,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • Android实现水波纹外扩效果的实例代码

    Android实现水波纹外扩效果的实例代码

    微信曾经推出了一个查找附近好友的功能,大致功能是这样的:屏幕上有一个按钮,长按按钮的时候,会有一圈圈水波纹的动画向外扩散,松手后,动画结束
    2018-05-05
  • Android仿微信公众号文章页面加载进度条

    Android仿微信公众号文章页面加载进度条

    这篇文章主要为大家详细介绍了Android仿微信公众号文章页面加载进度条,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06

最新评论