如何让用户移动光标但不编辑 android kotlin 中的 editText

How to let the user move cursor but not edit the editText in android kotlin

我正在制作一个计算器。众所周知,每个计算器都使用由开发人员自行开发的键盘。我正在使用 editText 根据用户单击的按钮进行输出。这不是问题。问题是我希望用户移动光标,select 输入文本的某些部分但不使用 android 键盘编辑它。我使用了 focusable 和 cursorenabled 方法,但没有任何帮助。我希望你们中有人能帮助我。我正在使用科特林。谢谢

您可以使用 setShowSoftInputOnFocus(Boolean) 设置键盘是否显示 EditText,如下所示:

editText.showSoftInputOnFocus = false

这样 android 键盘将不会显示,用户仍然可以移动光标和 select 文本。文档 here

注意:此方法仅适用于API21及以上(截至2020年10月超过94%的活跃设备)。

您想要所有常用的选择和编辑内容可用,但不希望内容在用户键入内容时实际发生变化?

您可以将 InputFilter 添加到 EditText,并覆盖 filter 方法:

This method is called when the buffer is going to replace the range dstart … dend of dest with the new text from the range start … end of source. Return the CharSequence that you would like to have placed there instead, including an empty string if appropriate, or null to accept the original replacement.

link 中有更多详细信息,但基本上您可以 dest return dstart...dend,即要替换的原始部分,因此内容没有实际变化。像这样

editText.filters += InputFilter { _, _, _, dest, dstart, dend -> dest.subSequence(dstart, dend) }

编辑: 设置 showSoftInputOnFocus 可能有用,但它的字面意思只是“在视图时不显示软键盘 (on-screen)是专注的”。您仍然可以通过几种方式编辑文本:

  • 在硬件键盘上键入(某些设备有它们,您可以通过在计算机键盘上键入来在模拟器中进行测试)
  • 点击光标粘贴内容
  • 保持 EditText 专注,离开应用程序,然后返回 - 软键盘可能会弹出

等等。此外,辅助功能服务可能会覆盖某些内容,并允许用户显示他们选择的输入,即使您说的是“我不想显示键盘”

(据我所知)可靠地阻止用户 更改 EditText 内容的唯一方法是使用 InputFilter阻止所有更改。您也可以将 showSoftInputOnFocus 设置为 false,以尝试避免键盘出现 - 但正如我所说,在某些情况下它仍然会出现。 InputFilter 将阻止它产生任何影响