android - 在 DialogFragment 中未触发 onKeyDown() 事件
问题描述
我在我的应用程序中捕获关键事件(从外部键盘)。我onKeyDown()
使用Activity
. 在我的应用程序中,我在不同的片段之间切换。如果我处于正常状态,则按下按钮时会触发Fragment
Activity 。onKeyDown()
但是当我使用 aDialogFragment
作为对话框时,按下按钮不会再触发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 不再显示为对话框。
当我的对话框显示时,我该怎么做才能让事件也触发?
解决方案
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()
}
}
推荐阅读
- reactjs - 如何在反应获取库中模拟上下文?
- flutter - 每当我与我的颤振应用程序交互时,都会在控制台中打印一些语句。如何阻止它?
- javascript - 未捕获的类型错误:在 JS 中
- couchdb - 我在本地和远程有相同的文档,但转速不同,但它们没有同步
- html - 使用 CSS 自定义类型的输入
- oauth - 使用同一个应用程序的商家之间是否共享具有 Square API 的客户
- css - 如何阻止 React 中多列中的元素溢出?
- android - Xamarin 跨平台 - 来自 IPhotoPickerService 的图像文件未出现
- python - 为什么我的 while 循环不适用于这些函数?
- android-studio - 每次我在 pubspec.yaml 中添加新依赖项时都必须重新启动 Android Studio| 扑