1. 程式人生 > >Fragment監聽返回鍵(Fragment響應Activity的onKeyDown事件)Kotlin版

Fragment監聽返回鍵(Fragment響應Activity的onKeyDown事件)Kotlin版

在Fragment不僅僅只可以監聽返回鍵哦,所有你見過的按鍵都可以監聽,什麼A~Z,0~9,F1~F12等等我就不舉例子了。至於為什麼寫這篇部落格,因為我的專案是一個Activity+多個Fragment架構的,下面進入正題。。。。直接上程式碼(原創轉載請標明)

    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (isInterception) {
                if (backListener != null) {
                    backListener!!.onbackForward()
                    return false
                }
            }
        } else if (keyCode == KeyEvent.KEYCODE_STAR) {
            if (startListener != null) {
                startListener!!.onStartButtonPressed()
                return false
            }
        } else if (keyCode == KeyEvent.KEYCODE_POUND) {
            if (poundListener != null) {
                poundListener!!.onPoundButtonPressed()
                return false
            }
        } else if (keyCode == KeyEvent.KEYCODE_PERIOD) {
            if (pointListener != null) {
                pointListener!!.onPointButtonPressed()
                return false
            }
        } else if (keyCode == KeyEvent.KEYCODE_F1) {
            if (f1Listener != null) {
                f1Listener!!.onF1Pressed()
            }
        } else if (keyCode == KeyEvent.KEYCODE_F2) {
            if (f2Listener != null) {
                f2Listener!!.onF2Pressed()
            }
        } else if (keyCode == KeyEvent.KEYCODE_F3) {
            if (f3Listener != null) {
                f3Listener!!.onF3Pressed()
            }
        }
        return super.onKeyDown(keyCode, event)
    }


以上程式碼是寫在MainActivity裡面的,在onkeydown事件下監聽不同按鍵的KeyKode(可以參考keycode列表傳送門--->http://www.cnblogs.com/bluestorm/p/4886662.html),我這裡主要監聽了星號鍵,井號鍵,英文.,F1,F2,F3,有人會問為什麼要監聽F1,F2,F3,因為最近在做PDA,按鍵比較多。廢話不多說,那我們怎麼把這個Activity中的事件傳到Fragment中呢,就是通過介面,上程式碼:


interface FragmentF1Listener {
    fun onF1Pressed()
}
這裡簡單的舉了一個例子,我們通過介面回撥的方式將事件傳到Fragment,所以定義了一個方法,onF1Pressed(),接下來在BaseFragment實現這個介面,從而實現介面的方法onF1Pressed(),並且在fragment中初始化Activity中定義的介面物件,下面是程式碼:
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        if (activity is MainActivity) {
            (activity as MainActivity).backListener = this
            (activity as MainActivity).startListener = this
            (activity as MainActivity).poundListener = this
            (activity as MainActivity).pointListener = this

            (activity as MainActivity).f1Listener = this
            (activity as MainActivity).f2Listener = this
            (activity as MainActivity).f3Listener = this
//            activity.isInterception = true
        }
    }

記得要在銷燬時,消除引用,下面是程式碼

    override fun onDestroy() {
        super.onDestroy()
        if (activity is MainActivity) {
            (activity as MainActivity).backListener = null
            (activity as MainActivity).startListener = null
            (activity as MainActivity).poundListener = null
            (activity as MainActivity).pointListener = null

            (activity as MainActivity).f1Listener = null
            (activity as MainActivity).f2Listener = null
            (activity as MainActivity).f3Listener = null
//            activity.isInterception = true
        }
        if (presenter != null) {
            presenter!!.onDestroy()
        }
    }

這樣就可以實現正在Framgnet中監聽Back,以及更多的鍵了