您好,登錄后才能下訂單哦!
這篇“Android onbackpressed如何實現返回鍵的攔截和彈窗”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Android onbackpressed如何實現返回鍵的攔截和彈窗”文章吧。
這是 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 方法內:
如果想阻止返回事件,那就什么都不做
如果想允許返回事件,那就使用 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如何實現返回鍵的攔截和彈窗”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。