【问题标题】:How to let the user move cursor but not edit the editText in android kotlin如何让用户移动光标但不编辑android kotlin中的editText
【发布时间】:2020-10-18 23:49:17
【问题描述】:

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

【问题讨论】:

  • 试试 android:inputType="none", android:textIsSelectable="true", android:focusable="false"
  • @ImtiyazKhalani 好吧,这个问题与我的不完全相同,他只想将 edittext 设为只读,而我的情况与问题描述中的不同。关于您的第二次回复,谢谢!但我的问题已经解决了。

标签: android kotlin android-edittext cursor


【解决方案1】:

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

editText.showSoftInputOnFocus = false

这样安卓键盘不会显示,用户仍然可以移动光标并选择文本。文档here

注意:此方法仅适用于 API 21 及更高版本(截至 2020 年 10 月,超过 94% 的活动设备)。

【讨论】:

    【解决方案2】:

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

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

    当缓冲区要将dest 的范围dstart … dend 替换为start … end 的范围start … end 中的新文本时调用此方法。 返回您希望放置在那里的 CharSequence,包括一个空字符串(如果合适),或 null 以接受原始替换。

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

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

    edit: 设置showSoftInputOnFocus 可能很有用,但它的字面意思只是“当视图聚焦时不显示软(屏幕)键盘”。您仍然可以通过以下几种方式编辑文本:

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

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

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

    【讨论】:

    • 你的方法也是对的,但是当你想过滤部分文本的时候最好使用。 @Siddharth Sharma 方法是最好的,它适用于我,因为我的 minSDK 版本是 21。我将使用您的方法过滤用户粘贴的内容,因为计算器允许粘贴。
    • 我编辑了更多信息 - 尝试隐藏键盘并不能保证用户无法更改内容,如果这很重要,您就不能真正依赖它
    猜你喜欢
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 2016-06-14
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多