在DialogFragment中时不会触发onKeyDown()事件

时间:2018-11-23 12:37:14

标签: android android-fragments android-activity kotlin android-dialogfragment

我在我的应用程序中捕获了按键事件(通过外部键盘)。我使用onKeyDown()中的Activity方法。在我的应用程序中,我在不同的片段之间切换。如果我的状态为Fragment,则按下按钮时会触发活动的onKeyDown()。但是,当我使用DialogFragment作为对话框时,按下按钮不会再触发Activity's onKeyDown()`。

这里有一些示例代码:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    fun onClick(view: View) {
// a) Key Event works if adding it via a fragment transaction by my own
//        val fragment = MyDialogFragment.newInstance()
//        val fragmentTransaction = supportFragmentManager.beginTransaction()
//        fragmentTransaction.add(R.id.fr_container, fragment, fragment.javaClass.name)
//        fragmentTransaction.commit()

// b) Key Event doesn't work if showing as a dialog
        val fragment = MyDialogFragment.newInstance()
        fragment.show(supportFragmentManager, fragment.javaClass.name)

    }

    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
        Log.i(javaClass.name, "onKeyDown() keyCode: $keyCode")
        return true
    }
}

还有我的两个片段:

class MyNormalFragment : Fragment() {
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_my_normal, container, false)
    }
}


class MyDialogFragment : DialogFragment() {
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_my_dialog, container, false)
    }

    companion object {
        fun newInstance() = MyDialogFragment()
    }
}

一旦我致电 a) show()打开MyDialogFragment,则不再捕获关键事件。但是,如果我通过自定义Fragments事务打开MyDialogFragment b),则仍会捕获关键事件,但是我的Fragment不再显示为对话框。

我该怎么办才能让事件在显示对话框时也触发?

3 个答案:

答案 0 :(得分:1)

对话框在一个单独的窗口中显示/作为单独的窗口显示,因此您的“活动”不再具有按键功能。但是,对话框具有自己的onKeyDown方法,因此您可以使用它。

答案 1 :(得分:1)

Ridcully的答案是正确的。我只想发布在MyDialogFragment内部所做的更改,以继续捕获关键事件:

class MyDialogFragment : DialogFragment() {
    private val keyEventListener = DialogInterface.OnKeyListener { dialog, keyCode, event ->
        Log.i(javaClass.name, "onKey() keyCode: $keyCode")
        true
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        dialog.setOnKeyListener(keyEventListener)
        return inflater.inflate(R.layout.fragment_my_dialog, container, false)
    }

    override fun onDestroyView() {
        dialog.setOnKeyListener(null)
        super.onDestroyView()
    }

    companion object {
        fun newInstance() = MyDialogFragment()
    }
}

答案 2 :(得分:0)

只需直接在DialogFragment上添加一个简单的DialogInterface.OnKeyListener