網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
前言
此文章主要解決攔截用戶點(diǎn)擊手機(jī)底部導(dǎo)航欄中的返回鍵時(shí)該事件的攔截;
此方法依然可以適用于fragment
onBackPressed()
這是 activity 中自帶的攔截返回的方法;
每當(dāng)我們按下底部導(dǎo)航的返回鍵時(shí),就會(huì)調(diào)用該事件,我們可以通過(guò)重寫(xiě)它來(lái)阻止 activity 的銷毀
譬如下方代碼,我們直接把 super 注釋掉,那么點(diǎn)擊返回鍵時(shí)就不會(huì)有任何反應(yīng),因?yàn)槲覀儾](méi)有針對(duì)性的進(jìn)行響應(yīng)的事件處理
override fun onBackPressed() { // super.onBackPressed() }
onBackPressedDispatcher
fragment 沒(méi)有提供 onBackPressed 方法,故大多數(shù)情況下使用 android 推薦的 onBackPressedDispatcher 來(lái)進(jìn)行返回鍵的攔截操作;
接下來(lái)是一個(gè)攔截返回并彈窗,詢問(wèn)是否退出的一個(gè)小案例;
為便于大家理解,故直接使用 activity 而非 fragment;
首先使用屬性委托 lazy,即懶加載的方式定義一個(gè) onBackPressedDispatcher 變量
class NoteActivity : AppCompatActivity() { private val dispatcher by lazy { NoteActivity().onBackPressedDispatcher } override fun onCreate(savedInstanceState: Bundle?) { ... } }
接著在 oncreate
方法中注冊(cè) onBackPressedDispatcher
;
注冊(cè)的方式即添加一個(gè)回調(diào)函數(shù)用處處理攔截時(shí)的動(dòng)作,使用 addCallback
;
addCallback
有兩個(gè)參數(shù),第一個(gè)為上下文,第二個(gè)為 OnBackPressedCallback
函數(shù)方法(下面的代碼使用了 lambda 的形式提高效率)
OnBackPressedCallback 函數(shù)接收一個(gè)參數(shù),我們一般都填 true;
它還需要實(shí)現(xiàn)一個(gè)方法 handleOnBackPressed
,這里面就是處理對(duì)應(yīng)實(shí)踐的地方了
在 handleOnBackPressed 方法內(nèi):
- 如果想阻止返回事件,那就什么都不做
- 如果想允許返回事件,那就使用 finish,結(jié)束掉本 activity
override fun onCreate(savedInstanceState: Bundle?) { ... dispatcher.addCallback( this, object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { // 構(gòu)造一個(gè)AlertDialog,具體怎么用不細(xì)說(shuō) AlertDialog.Builder(this@NoteActivity).apply { setTitle("Oops!") setMessage("請(qǐng)寫(xiě)上一個(gè)標(biāo)題奧,不然咱沒(méi)法保存") setIcon(R.drawable.ic_info) // 點(diǎn)擊了確認(rèn)按鈕,直接使用finish銷毀本activity setPositiveButton("直接退出") { dialog, which -> finish() } // 點(diǎn)了否定,就啥都不做,即不處理返回事件,那自然就不會(huì)銷毀了 setNegativeButton("我再想想", null) }.show() } } ) }
最后,在 onBackPressed 中觸發(fā) onBackPressedDispatcher (因?yàn)榉祷劓I點(diǎn)擊事件都由 onBackPressed 所攔截,onBackPressedDispatcher 僅僅是充當(dāng)了一個(gè)助手的作用)
注意刪掉或者注釋原來(lái)的的 super,否則你點(diǎn)返回鍵就直接退出了,那就前功盡棄了?。。?/p>
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) // 注冊(cè)回調(diào)事件 dispatcher.addCallback( this, object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { AlertDialog.Builder(this@NoteActivity).apply { setTitle("Oops!") setMessage("請(qǐng)寫(xiě)上一個(gè)標(biāo)題奧,不然咱沒(méi)法保存") setIcon(R.drawable.ic_info) setPositiveButton("直接退出") { dialog, which -> finish() } setNegativeButton("我再想想", null) }.show() } } ) } // 檢測(cè)返回鍵點(diǎn)擊事件 override fun onBackPressed() { dispatcher.onBackPressed() } }
原文鏈接:https://blog.csdn.net/delete_you/article/details/127822059
相關(guān)推薦
- 2022-09-15 Python利用psutil實(shí)現(xiàn)獲取硬件,網(wǎng)絡(luò)和進(jìn)程信息_python
- 2022-04-10 git push異常整理 error: failed to push some refs to
- 2023-01-12 C語(yǔ)言技巧提升之回調(diào)函數(shù)的掌握_C 語(yǔ)言
- 2022-11-15 詳解kubelet?創(chuàng)建pod流程代碼圖解及日志說(shuō)明_云其它
- 2022-10-22 redis緩存一致性延時(shí)雙刪代碼實(shí)現(xiàn)方式_Redis
- 2022-03-14 ffmpeg開(kāi)發(fā)打印音視頻meta信息
- 2024-03-28 Springboot maven加入本地jar,提示找不到類
- 2022-03-26 C語(yǔ)言實(shí)現(xiàn)字符串替換的示例代碼_C 語(yǔ)言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支