【问题标题】:Android Edit Text Cursor Doesn't AppearAndroid 编辑文本光标不出现
【发布时间】:2013-01-11 16:52:56
【问题描述】:

在我的应用程序中,我使用以下代码禁用了键盘(我现在使用我的自定义键盘):

editText.setInputType(InputType.TYPE_NULL);

现在,我的问题是文本光标不再出现在编辑文本中。我该怎么办?任何建议将不胜感激。

【问题讨论】:

  • 它没有出现是因为没有键盘,因此没有理由有光标
  • 但我使用自定义键盘,我希望光标可见。我该怎么做?
  • 字母可见吗?我遇到了一个问题,由于主题,所有东西都具有背景颜色,并且似乎不可见,改变前景或背景颜色可能会有所帮助。也要注意提示和缓存颜色!

标签: android android-edittext text-cursor


【解决方案1】:

在错误跟踪器Issue opened in bug tracker 中为此打开了一个问题。 其中一位用户建议了适用于“大多数”设备的方法。

简单地说,你所要做的就是打电话:

editText.setRawInputType(InputType.TYPE_CLASS_TEXT);

用于您的 EditText 视图(在您调用 editText.setInputType(InputType.TYPE_NULL); 之后)。

您可能还应该设置:

editText.setTextIsSelectable(true);

为了选择文本(尽管 in 似乎不适用于三星 Galaxy SIII)。此方法仅从 HONEYCOMB (api11) 开始可用,因此在为较旧的 Android 版本开发时请记住这一点。

还指出,您的 EditText 不应该是活动开始时接收焦点的第一个视图(如果是 - 只是从另一个视图请求焦点())。虽然我(个人)对此没有遇到任何问题。

【讨论】:

  • 非常感谢您的回答。我以前尝试过类似的东西,但没有奏效。我猜是因为我没有将编辑文本设置为 setTextIsSelectable(true);
  • 我会注意到,这个问题显然不会在 API 15 之前出现(基于报告和我自己的测试),因此 setTextIsSelectable() 应该 可供所有人使用出现问题的设备。如果您支持早于该方法的 API,您将必须测试 API(或使用反射来测试该方法)以确保该方法在设备上可用。另外,仅供参考,我已经尝试使用针对 API 级别 9 的 APK 单独使用 editText.setRawInputType() 并没有解决问题。这可能意味着,正如 ziziana 也建议的那样,这两种方法都是必需的
  • 它对我有用。如果对该解决方案有效的原因给出任何解释,那就太好了。谢谢。
  • xml 中的替代方案,您也可以将其指定为android:textIsSelectable=true
【解决方案2】:

为什么不为您的自定义键盘使用自定义视图,而不是实现一个成熟的 IME?这将解决您的光标问题,甚至可以让您的键盘在您的应用之外可用(如果您愿意的话)。

如果您想这样做,此答案有几个有用的链接: How to develop a soft keyboard for Android?

【讨论】:

  • 成熟的 IME 有 2 个主要限制:
  • 1) 您应该请求用户许可才能安装额外的 IME。 2) 用户应明确声明他想使用您的自定义输入法而不是标准输入法(这涉及到tweakink 设备设置)。显然,这不适合用户只想在一个特定的 EditText 字段中限制输入的情况
【解决方案3】:

我真的不建议这样做。编写一个好的完整的 IME 真的很难。此外,用户开始期待他们的键盘提供的功能(自动更正、Swyping、下一个单词预测、更改语言的能力),除非您在键盘本身上花费数月时间,否则您不会拥有这些功能。任何不允许我使用 Swype 的应用程序都会立即被删除(偏见说明:我在 Swype android 上工作)。

但是,如果您想作为键盘与操作系统完全集成,您将不得不编写一个 InputMethodService。然后,用户可以在键盘选择菜单中选择您的键盘,并可用于任何应用程序。这是获得完整操作系统集成的唯一方法,否则您将需要真正从头开始 - 编写自己的 EditView。玩得开心,得到一个看起来不错的东西绝对不是微不足道的。

此外,将输入类型设置为 null 不会禁用大多数键盘。它只是将它们置于哑模式并关闭预测之类的功能。

【讨论】:

  • 显然,当前的讨论与创建您自己的输入法无关,该输入法将利用所有可能的用例。人们想要做的只是将用户输入限制为某些预定义的变体(自定义字母、符号或短语),因此开发人员应该更好地了解何时禁用标准输入是个好主意。
  • 开发人员有权这样做,但我仍然强烈反对。我不会使用任何不允许我使用具有 Swype 功能的键盘的应用程序。一般来说,更换用户的键盘是个坏主意。
  • 实际上确实如此——我告诉他们如何编写一个真正的 Android 键盘以及为什么他们的方法存在根本缺陷
【解决方案4】:

我尝试了以下答案并且它有效,但请注意 1)EditText不能专注于初始化 2)当用户的焦点在editText上时,当您的方向发生变化时,会弹出备用键盘,这是另一个“可解决”的问题。

这在之前的回答中提到过,但请注意您必须确保您的 editText 元素不会关注实例化:

https://code.google.com/p/android/issues/detail?id=27609#c7

#7 nyphb...@gmail.com

我终于找到了一个(对我来说)可行的解决方案。

第一部分(在 onCreate 中):

mText.setInputType(InputType.TYPE_NULL);
if (android.os.Build.VERSION.SDK_INT >= 11 /*android.os.Build.VERSION_CODES.HONEYCOMB*/) {
    // this fakes the TextView (which actually handles cursor drawing)
    // into drawing the cursor even though you've disabled soft input
    // with TYPE_NULL
    mText.setRawInputType(InputType.TYPE_CLASS_TEXT);
}

另外,需要将android:textIsSelectable设置为true(或者在onCreate中设置)并且EditText一定不能专注于初始化。如果您的 EditText 是第一个可聚焦的视图(在我的情况下是这样),您可以通过将其放在其上方来解决此问题:

<LinearLayout
  android:layout_width="0px"
  android:layout_height="0px"
  android:focusable="true"
  android:focusableInTouchMode="true" >
    <requestFocus />
</LinearLayout>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 2016-07-05
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多