【发布时间】:2018-11-23 12:37:13
【问题描述】:
我在我的应用程序中捕获关键事件(从外部键盘)。我使用来自Activity 的onKeyDown() 方法。在我的应用程序中,我在不同的片段之间切换。如果我在正常的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