android - 如何在 Fragment 中覆盖 dispatchTouchEvent
问题描述
我想在创建dispatchTouchEvent
的众多之一中使用. 问题是在其他片段中引起一些问题,所以我想让它只在单个片段中激活,但没有这种类型的功能。Fragments
Activity
dispatchTouchEvent
Fragment
有什么方法可以在 Fragment 中实现它吗?
我需要这个功能,因为我有问题,如果我为我的片段根视图(键盘仍然可见并且仍然集中)EditTexts
,他们拒绝失去焦点。话虽如此,我在 stackOverflow 上发现了“神奇”功能,可以解决我应用程序中任何地方的焦点问题:onClickListener
EditTexts
“魔法功能”:
override fun dispatchTouchEvent(event: MotionEvent): Boolean {
if (event.action == MotionEvent.ACTION_DOWN) {
val v = currentFocus
if (v is EditText) {
val outRect = Rect()
v.getGlobalVisibleRect(outRect)
if (!outRect.contains(event.rawX.toInt(), event.rawY.toInt())) {
v.clearFocus()
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager?
imm!!.hideSoftInputFromWindow(v.getWindowToken(), 0)
}
}
}
return super.dispatchTouchEvent(event)
}
我试图制作一些充当触摸检测器的拦截器View
(例如)。FrameLayout
然后我添加onTouchListener
并使用了与函数类似的代码dispatchTouchEvent
。但这不起作用。我也尝试将 onTouchListener 应用于我的片段rootView
,但结果相同。
示例(在这种情况下,拦截器位于FrameLayout
我的整个布局中):
interceptor.setOnTouchListener { _, event ->
if (event.action == MotionEvent.ACTION_DOWN) {
val view = activity?.currentFocus
if (view is EditText) {
val outRect = Rect()
view.getGlobalVisibleRect(outRect)
if (!outRect.contains(event.rawX.toInt(), event.rawY.toInt())) {
view.clearFocus()
val imm = view.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager?
imm!!.hideSoftInputFromWindow(view.getWindowToken(), 0)
}
}
}
false
}
解决方案
推荐阅读
- c# - .Net Core CertificateRequest 作为参数
- c# - 如何在实体框架中创建双向导航属性?
- r - 逐个字符分隔字段中的值,根据可能的拆分数量在右侧创建多个列
- python - 导入不同目录中的文件 [PYTHON]
- php - 如果数据库中存在记录,则填充和锁定下拉列表
- prometheus - Prometheus - 如何获取最后一个值计数器指标
- symfony - 在 Twig 模板上加载 vich 上传器图像时显示文件不可上传异常
- qt - 在 Qt3D 中访问 FBX 的网格和骨架
- azure - 用于检查 Azure VM 是否启用了自动关闭的 Powershell 代码?
- ios - 使呈现的视图控制器忽略并传递触摸事件