<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
此文章主要解決攔截使用者點選手機底部導航欄中的返回鍵時該事件的攔截;
此方法依然可以適用於fragment
這是 activity 中自帶的攔截返回的方法;
每當我們按下底部導航的返回鍵時,就會呼叫該事件,我們可以通過重寫它來阻止 activity 的銷燬
譬如下方程式碼,我們直接把 super 註釋掉,那麼點選返回鍵時就不會有任何反應,因為我們並沒有針對性的進行響應的事件處理
override fun onBackPressed() { // super.onBackPressed() }
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 方法內:
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內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45