Android编辑框光标不出现

11

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

editText.setInputType(InputType.TYPE_NULL);

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


它没有键盘,因此没有光标,所以它不会显示。 - njzk2
但是我使用自定义键盘,我希望光标可见。我该怎么做? - Laura
字母可见吗?我遇到了一个问题,由于主题的原因,所有东西都具有背景颜色,并且看起来是不可见的。更改前景或背景颜色可能会有所帮助。还要注意提示和缓存颜色! - madlymad
4个回答

23

在错误追踪器中打开了一个问题Issue opened in bug tracker。其中一位用户建议采用这种方法,该方法适用于“大多数”设备。

简而言之,您需要做的就是调用:

editText.setRawInputType(InputType.TYPE_CLASS_TEXT);

如果您在调用editText.setInputType(InputType.TYPE_NULL);之后查看EditText视图,那么您可能还需要设置:

editText.setTextIsSelectable(true);

为了使文本可选(尽管在三星Galaxy SIII上似乎无法正常工作),可以使用以下方法。请注意,此方法仅从HONEYCOMB(api11)开始提供,因此在开发旧版Android时请牢记这一点。

另外,建议不要让您的 EditText 成为活动启动时接收焦点的第一个视图(如果是,请从另一个视图进行requestFocus()请求)。虽然我(个人而言)没有遇到过任何问题。


非常感谢您的回答。我之前尝试过类似的操作,但没有成功。我猜测这是因为我没有将我的编辑文本设置为setTextIsSelectable(true)。 - Laura
我想指出的是,根据报告和我的测试,这个问题显然不会在API 15之前发生,因此setTextIsSelectable() 应该适用于所有出现问题的设备。如果您支持早于该方法的API,则必须测试API(或使用反射测试该方法)以确保该方法在设备上可用。另外,我已经尝试过仅使用editText.setRawInputType()并将其针对API级别9的APK,但它并没有解决问题。这可能意味着,正如ziziana所建议的那样,两种方法都是必需的。 - Carl
它对我有效。如果能解释一下为什么这个解决方案有效就更好了。谢谢。 - Sandeep R
在xml中,你也可以将其设置为android:textIsSelectable=true - JaydeepW

0
不仅可以为自定义键盘使用自定义视图,为什么不实现一个完整的输入法?这将解决您的光标问题,甚至使您的键盘在应用程序之外也可用(如果您想要的话)。
如果您想这样做,此答案有几个有用的链接: 如何为Android开发软键盘?

全功能输入法有两个主要限制: - Alex Semeniuk
  1. 你应该征得用户同意来安装额外的输入法。
  2. 用户应明确表达他想使用你的自定义输入法而不是标准输入法(这涉及到调整设备设置)。显然,这并不适用于用户只想限制某个特定 EditText 字段中的输入的情况。
- Alex Semeniuk

0

我真的不建议这样做。编写一个好的完整的输入法编辑器是非常困难的。此外,用户希望从他们的键盘中获得功能(自动更正、滑动输入、下一个单词预测、更改语言的能力),如果您不花几个月时间来开发键盘本身,就无法提供这些功能。任何不允许我使用Swype的应用都会立即被删除(偏见注:我曾在Swype Android上工作)。

但是,如果您想要完全与操作系统集成为键盘,您将需要编写一个InputMethodService。然后,用户可以在键盘选择菜单中选择您的键盘,并可用于任何应用程序。这是获得完整操作系统集成的唯一方法,否则您将需要从头开始编写自己的EditView。祝你好运,因为设计出一个漂亮的EditView是相当困难的。

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


1
显然,当前的讨论与创建自己的输入法并利用每种可能的用例无关。 人们想要做的就是将用户输入限制在一些预定义的变体(自定义字母、符号或短语)中。 因此,开发者应该更好地知道何时禁用标准输入是一个好主意,何时不是。 - Alex Semeniuk
开发人员有权这样做,但我仍然强烈反对。如果一个应用程序不允许我使用具有Swype功能的键盘,我是不会使用它的。通常来说,替换用户的键盘是一个坏主意。 - Gabe Sechan
实际上它确实可以 - 我告诉他们如何编写一个真正的Android键盘以及为什么他们的方法在根本上存在缺陷。 - Gabe Sechan

0
我尝试了下面的答案,它有效,但要注意: 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是第一个可聚焦的View(就像我的情况一样),你可以通过将以下内容放在它上面来解决这个问题:
<LinearLayout
  android:layout_width="0px"
  android:layout_height="0px"
  android:focusable="true"
  android:focusableInTouchMode="true" >
    <requestFocus />
</LinearLayout>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接