Android onbackpressed實現(xiàn)返回鍵的攔截和彈窗流程分析
前言
此文章主要解決攔截用戶點擊手機(jī)底部導(dǎo)航欄中的返回鍵時該事件的攔截;
此方法依然可以適用于fragment
onBackPressed()
這是 activity 中自帶的攔截返回的方法;
每當(dāng)我們按下底部導(dǎo)航的返回鍵時,就會調(diào)用該事件,我們可以通過重寫它來阻止 activity 的銷毀
譬如下方代碼,我們直接把 super 注釋掉,那么點擊返回鍵時就不會有任何反應(yīng),因為我們并沒有針對性的進(jìn)行響應(yīng)的事件處理
override fun onBackPressed() {
// super.onBackPressed()
}
onBackPressedDispatcher
fragment 沒有提供 onBackPressed 方法,故大多數(shù)情況下使用 android 推薦的 onBackPressedDispatcher 來進(jìn)行返回鍵的攔截操作;
接下來是一個攔截返回并彈窗,詢問是否退出的一個小案例;
為便于大家理解,故直接使用 activity 而非 fragment;
首先使用屬性委托 lazy,即懶加載的方式定義一個 onBackPressedDispatcher 變量
class NoteActivity : AppCompatActivity() {
private val dispatcher by lazy {
NoteActivity().onBackPressedDispatcher
}
override fun onCreate(savedInstanceState: Bundle?) {
...
}
}
接著在 oncreate 方法中注冊 onBackPressedDispatcher;
注冊的方式即添加一個回調(diào)函數(shù)用處處理攔截時的動作,使用 addCallback;
addCallback 有兩個參數(shù),第一個為上下文,第二個為 OnBackPressedCallback 函數(shù)方法(下面的代碼使用了 lambda 的形式提高效率)
OnBackPressedCallback 函數(shù)接收一個參數(shù),我們一般都填 true;
它還需要實現(xiàn)一個方法 handleOnBackPressed ,這里面就是處理對應(yīng)實踐的地方了
在 handleOnBackPressed 方法內(nèi):
- 如果想阻止返回事件,那就什么都不做
- 如果想允許返回事件,那就使用 finish,結(jié)束掉本 activity
override fun onCreate(savedInstanceState: Bundle?) {
...
dispatcher.addCallback(
this,
object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
// 構(gòu)造一個AlertDialog,具體怎么用不細(xì)說
AlertDialog.Builder(this@NoteActivity).apply {
setTitle("Oops!")
setMessage("請寫上一個標(biāo)題奧,不然咱沒法保存")
setIcon(R.drawable.ic_info)
// 點擊了確認(rèn)按鈕,直接使用finish銷毀本activity
setPositiveButton("直接退出") { dialog, which ->
finish()
}
// 點了否定,就啥都不做,即不處理返回事件,那自然就不會銷毀了
setNegativeButton("我再想想", null)
}.show()
}
}
)
}
最后,在 onBackPressed 中觸發(fā) onBackPressedDispatcher (因為返回鍵點擊事件都由 onBackPressed 所攔截,onBackPressedDispatcher 僅僅是充當(dāng)了一個助手的作用)
注意刪掉或者注釋原來的的 super,否則你點返回鍵就直接退出了,那就前功盡棄了!?。?/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)
// 注冊回調(diào)事件
dispatcher.addCallback(
this,
object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
AlertDialog.Builder(this@NoteActivity).apply {
setTitle("Oops!")
setMessage("請寫上一個標(biāo)題奧,不然咱沒法保存")
setIcon(R.drawable.ic_info)
setPositiveButton("直接退出") { dialog, which ->
finish()
}
setNegativeButton("我再想想", null)
}.show()
}
}
)
}
// 檢測返回鍵點擊事件
override fun onBackPressed() {
dispatcher.onBackPressed()
}
}
到此這篇關(guān)于Android onbackpressed實現(xiàn)返回鍵的攔截和彈窗流程分析的文章就介紹到這了,更多相關(guān)Android onbackpressed內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android開發(fā)中Eclipse報錯及對應(yīng)處理方法總結(jié)
這篇文章主要介紹了Android開發(fā)中Eclipse報錯及對應(yīng)處理方法,實例匯總了使用eclipse開發(fā)Android項目過程中常見的錯誤提示及對應(yīng)的處理技巧,需要的朋友可以參考下2015-12-12
Android學(xué)習(xí)教程之動態(tài)GridView控件使用(6)
這篇文章主要為大家詳細(xì)介紹了Android動態(tài)GridView控件的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11
Android如何判斷一個點在不在多邊形區(qū)域內(nèi)
這篇文章主要為大家詳細(xì)介紹了Android判斷一個點在不在多邊形區(qū)域內(nèi)的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05
Android自定義View之漸變色折線圖的實現(xiàn)
折線圖的實現(xiàn)方法在github上有很多開源的程序,但是對于初學(xué)者來講,簡單一點的教程可能更容易入門,下面這篇文章主要給大家介紹了關(guān)于Android自定義View之漸變色折線圖的相關(guān)資料,需要的朋友可以參考下2022-04-04
Android實現(xiàn)水波紋外擴(kuò)效果的實例代碼
微信曾經(jīng)推出了一個查找附近好友的功能,大致功能是這樣的:屏幕上有一個按鈕,長按按鈕的時候,會有一圈圈水波紋的動畫向外擴(kuò)散,松手后,動畫結(jié)束2018-05-05

