HarmonyOS鸿蒙Next中输入法键盘无法点击问题

HarmonyOS鸿蒙Next中输入法键盘无法点击问题 鸿蒙4.2系统,做了一个全屏的、常驻的透明浮窗,相关参数配置为:

return WindowManager.LayoutParams().apply {
    type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
    format = PixelFormat.TRANSLUCENT
    flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
    gravity = Gravity.CENTER
    width = mWindowInfo?.width.value()
    height = mWindowInfo?.height.value()
    this.x = x
    this.y = y
}

浮窗可以穿透点击事件,但唯独EditText拉起的键盘无法点击,尝试过很多flags配置但都不行; 在三星pad上是可以正常点击键盘的,是华为系统做了什么特殊配置吗,有没有大佬解答一下


更多关于HarmonyOS鸿蒙Next中输入法键盘无法点击问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复
flags =
    WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
            WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM or WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN or
            WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS or WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE

更多关于HarmonyOS鸿蒙Next中输入法键盘无法点击问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


FLAG_ALT_FOCUSABLE_IM 参数生效,

感谢大佬,

鸿蒙Next输入法键盘无法点击通常由以下原因导致:

  1. 系统服务异常:输入法服务未正常启动或响应。
  2. 权限配置问题:应用未获取ohos.permission.INPUT_MONITORING权限。
  3. 焦点冲突:当前界面存在多个可聚焦组件,导致焦点未正确分配至输入框。
  4. 兼容性问题:第三方输入法与鸿蒙Next系统版本存在适配冲突。

可尝试重启设备或切换系统默认输入法进行临时恢复。

根据你提供的代码和描述,问题核心在于窗口的 FLAG_NOT_TOUCHABLE 标志。这个标志会阻止窗口接收所有触摸事件,包括系统输入法(IME)键盘的触摸事件。即使你的浮窗本身是透明的且希望事件穿透,但系统输入法键盘的触摸事件分发机制与普通应用窗口不同。

在HarmonyOS/Android系统中,输入法键盘是一个特殊的系统窗口。当软键盘弹出时,触摸事件的分发流程会经过你的窗口层。由于你设置了 FLAG_NOT_TOUCHABLE,你的窗口会明确拒绝接收这些事件,导致事件无法继续向下传递到键盘窗口,从而造成键盘点击无响应。

解决方案:

你需要移除 FLAG_NOT_TOUCHABLE 标志,并改用其他方式实现你想要的“穿透”和“常驻”效果。

  1. 关键修改:移除 FLAG_NOT_TOUCHABLE 这是解决键盘无法点击问题的必要步骤。

  2. 实现事件穿透: 移除可触摸标志后,你的窗口会开始接收触摸事件。为了让你下方的应用仍然能接收到这些事件,你需要在窗口的根视图(DecorView)上设置触摸事件监听器,并将事件向下传递

    yourWindow.decorView.setOnTouchListener { v, event ->
        // 将触摸事件传递给下层窗口
        false // 返回false,表示未消费事件,允许继续传递
    }
    

    或者,在自定义的浮窗View的 onTouchEvent 方法中直接返回 false

  3. 保持窗口常驻且不获取焦点:

    • FLAG_NOT_FOCUSABLE 标志你已经设置,这可以防止你的窗口获取输入焦点(避免影响下层应用的EditText)。
    • 为了确保窗口在锁屏等情况下依然显示,你可能需要 FLAG_SHOW_WHEN_LOCKED(谨慎使用,涉及隐私)。
    • FLAG_LAYOUT_NO_LIMITS 允许窗口扩展到屏幕外,这与你当前的配置一致。

修改后的参数配置示例:

return WindowManager.LayoutParams().apply {
    type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
    format = PixelFormat.TRANSLUCENT
    // 移除了 FLAG_NOT_TOUCHABLE
    flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
            WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
    gravity = Gravity.CENTER
    width = mWindowInfo?.width.value()
    height = mWindowInfo?.height.value()
    this.x = x
    this.y = y
}

同时,确保你的浮窗视图(或DecorView)不消费触摸事件(如上所述)。

关于设备差异: 不同厂商(如华为与三星)对系统输入法、窗口管理和触摸事件分发的底层实现可能存在细微差异,这解释了为何在三星设备上某些配置“碰巧”能工作。遵循上述基于标准框架的解决方案能确保在HarmonyOS及其他Android衍生系统上获得一致、可靠的行为。

总结,根本原因是 FLAG_NOT_TOUCHABLE 过度拦截了事件。正确的做法是让窗口可触摸,但主动不消费事件,使其穿透。

回到顶部