亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android onbackpressed實(shí)現(xiàn)返回鍵的攔截和彈窗流程分析

 更新時(shí)間:2023年01月04日 16:03:55   作者:知奕奕  
很多網(wǎng)友不明白如何在Android平臺(tái)上捕獲Back鍵的事件,Back鍵是手機(jī)上的后退鍵,一般的軟件不捕獲相關(guān)信息可能導(dǎo)致你的程序被切換到后臺(tái),而回到桌面的尷尬情況,在Android上有兩種方法來(lái)獲取該按鈕的事件

前言

此文章主要解決攔截用戶點(diǎn)擊手機(jī)底部導(dǎo)航欄中的返回鍵時(shí)該事件的攔截;

此方法依然可以適用于fragment

onBackPressed()

這是 activity 中自帶的攔截返回的方法;

每當(dāng)我們按下底部導(dǎo)航的返回鍵時(shí),就會(huì)調(diào)用該事件,我們可以通過(guò)重寫它來(lái)阻止 activity 的銷毀

譬如下方代碼,我們直接把 super 注釋掉,那么點(diǎn)擊返回鍵時(shí)就不會(huì)有任何反應(yīng),因?yàn)槲覀儾]有針對(duì)性的進(jìn)行響應(yīng)的事件處理

override fun onBackPressed() {
    // super.onBackPressed()
}

onBackPressedDispatcher

fragment 沒有提供 onBackPressed 方法,故大多數(shù)情況下使用 android 推薦的 onBackPressedDispatcher 來(lái)進(jìn)行返回鍵的攔截操作;

接下來(lái)是一個(gè)攔截返回并彈窗,詢問是否退出的一個(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)寫上一個(gè)標(biāo)題奧,不然咱沒法保存")
                    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)返回鍵就直接退出了,那就前功盡棄了!??!

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)寫上一個(gè)標(biāo)題奧,不然咱沒法保存")
                        setIcon(R.drawable.ic_info)
                        setPositiveButton("直接退出") { dialog, which ->
                            finish()
                        }
                        setNegativeButton("我再想想", null)
                    }.show()
                }
            }
        )
    }
    // 檢測(cè)返回鍵點(diǎn)擊事件
    override fun onBackPressed() {
        dispatcher.onBackPressed()
    }
}

到此這篇關(guān)于Android onbackpressed實(shí)現(xiàn)返回鍵的攔截和彈窗流程分析的文章就介紹到這了,更多相關(guān)Android onbackpressed內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論