Android 在DialogFragment中时未触发onKeyDown()事件

Android 在DialogFragment中时未触发onKeyDown()事件,android,android-fragments,android-activity,kotlin,android-dialogfragment,Android,Android Fragments,Android Activity,Kotlin,Android Dialogfragment,我从应用程序中的外部键盘捕获关键事件。我使用活动中的onKeyDown方法。在我的应用程序中,我在不同片段之间切换。如果我在一个正常片段中,则当按下按钮时会触发活动的onKeyDown。但当我使用DialogFragment作为对话框时,按下按钮不会再触发活动“sonKeyDown” 下面是一些示例代码: class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle

我从应用程序中的外部键盘捕获关键事件。我使用活动中的onKeyDown方法。在我的应用程序中,我在不同片段之间切换。如果我在一个正常片段中,则当按下按钮时会触发活动的onKeyDown。但当我使用DialogFragment作为对话框时,按下按钮不会再触发活动“sonKeyDown”

下面是一些示例代码:

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()
    }
}
只要我调用show打开MyDialogFragment,就不会再捕获关键事件。但是如果我通过自定义片段事务打开MyDialogFragment b,那么仍然会捕获关键事件,但我的片段不再显示为对话框


当显示我的对话框时,我必须做些什么才能让事件也触发?

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

对话框显示在/中作为单独的窗口,因此您的活动不再具有按键的焦点。不过,该对话框有自己的onKeyDown方法,因此您可以利用它。

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()
    }
}

里德卡利的答案是正确的。我只是想发布我在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()
    }
}

只需添加一个简单的DialogInterface.OnKeyListener直接在DialogFragment上添加一个简单的DialogInterface.OnKeyListener直接在DialogFragment上添加一个简单的DialogInterface.OnKeyListener你能解释你的答案吗?你能解释你的答案吗?这是一个救命的答案。在找到答案之前,我一直在胡思乱想。我只是简单地创建了私有类DialogExtendedDialog,并将我的onKeyDown和onKeyUp逻辑放入其中,它按照我的预期工作!这是一个救命的答案。在找到答案之前,我一直在胡思乱想。我只是简单地创建了私有类DialogExtendedDialog,并将我的onKeyDown和onKeyUp逻辑放入其中,它按照我的预期工作!