如果编辑文本在后退手势期间获得焦点,预测后退会卡住

问题描述 投票:0回答:1

我目前正在尝试在我的应用程序中实现预测,但遇到了一个错误。

这似乎是 Android 14 或三星操作系统的错误。该错误的情况似乎是:

  • 预测返回已启用
  • 用户位于带有编辑文本的对话框片段屏幕上
  • 编辑文本已获得焦点,且处于“选择文本”模式(光标为泪珠形状而不是竖线)

如果用户缓慢启动后退手势,则预测后退会被触发,但随后会卡住。不会触发任何取消事件(不调用

handleOnBackCancelled()
)。

我能够在具有最新更新(Android 14)的 S24 上重现此错误,但无法在具有最新更新(也是 Android 14)的 Pixel 7 上重现此错误。我知道 Pixel 系列获得了 2 个特定的操作系统补丁,因此可能只是 Pixel 7 获得了修复,而三星操作系统并未引入该修复。不过我并不排除这是三星特有的错误的可能性。

如果有人知道原因或解决方法,请告诉我。

android fragment predictive-back
1个回答
0
投票

此错误似乎是 Android 14 错误或三星操作系统错误。我没有非 Pixel 和非 Samsung Android 14 设备可供确认。

我能够想到一个解决方法,因为除了更新操作系统之外不太可能有解决该错误的方法。

解决方法是删除 EditText 具有焦点但不显示键盘的状态。据我所知,消除这种状态并不会降低用户体验。

我这样做的方法是为键盘可见性设置一个侦听器,如下所示:

class MyDialogFragment : DialogFragment() {
  ...
  private val isKeyboardHiddenState = MutableStateFlow(true)

  override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    ViewCompat.setOnApplyWindowInsetsListener(binding.root) { v, windowInsets ->
      val imeInset = windowInsets.getInsets(WindowInsetsCompat.Type.ime())
      isKeyboardHiddenState.value = imeInset.bottom == 0
      WindowInsetsCompat.CONSUMED
    }

    viewLifecycleOwner.lifecycleScope.launch {
      isKeyboardHiddenState.collect { isKeyboardHidden ->
        if (isKeyboardHidden && myEditText.isFocused) {
          myEditText.clearFocus()
        }
      }
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.