【问题标题】:onKeyDown() event not triggered when in DialogFragment在 DialogFragment 中未触发 onKeyDown() 事件
【发布时间】:2018-11-23 12:37:13
【问题描述】:

我在我的应用程序中捕获关键事件(从外部键盘)。我使用来自ActivityonKeyDown() 方法。在我的应用程序中,我在不同的片段之间切换。如果我在正常的Fragment 中,那么在按下按钮时会触发 Activity 的onKeyDown()。但是当我使用DialogFragment 作为对话框时,按下按钮不会再触发Activity'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()
    }
}

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

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

【问题讨论】:

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


    【解决方案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】:

      对话框显示在/作为单独的窗口中,因此您的 Activity 不再具有按键的焦点。但是,Dialog 有它自己的 onKeyDown 方法,所以你可以使用它。

      【讨论】:

      • 这是一个救命的答案。在找到这个答案之前,我一直在拔头发。我只是简单地创建了private class DialogExtended extends Dialog 并将我的onKeyDownonKeyUp 逻辑放入其中,它按我的预期工作!
      【解决方案3】:

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

      【讨论】:

      • 你能解释一下你的答案吗?
      猜你喜欢
      • 1970-01-01
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      • 2020-04-25
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多