91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android?onbackpressed如何實現返回鍵的攔截和彈窗

發布時間:2023-01-05 09:31:04 來源:億速云 閱讀:276 作者:iii 欄目:開發技術

這篇“Android onbackpressed如何實現返回鍵的攔截和彈窗”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Android onbackpressed如何實現返回鍵的攔截和彈窗”文章吧。

onBackPressed()

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

每當我們按下底部導航的返回鍵時,就會調用該事件,我們可以通過重寫它來阻止 activity 的銷毀

譬如下方代碼,我們直接把 super 注釋掉,那么點擊返回鍵時就不會有任何反應,因為我們并沒有針對性的進行響應的事件處理

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

onBackPressedDispatcher

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如何實現返回鍵的攔截和彈窗”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

黑龙江省| 海原县| 凤山市| 东莞市| 凌源市| 登封市| 甘洛县| 九龙城区| 兰溪市| 沈丘县| 民县| 滨州市| 太谷县| 怀安县| 荔波县| 绥芬河市| 西吉县| 栖霞市| 邢台县| 高邮市| 彝良县| 阿巴嘎旗| 娄底市| 玛多县| 上栗县| 阳西县| 武冈市| 泸州市| 巴塘县| 萨迦县| 西盟| 南江县| 宜宾县| 浏阳市| 全南县| 绥芬河市| 临西县| 循化| 杭锦旗| 丰原市| 京山县|