我在Android中的EditText遇到了一些问题。通常,当用户长按EditText或双击它时,会突出显示光标所在的单词,并弹出EditText的上下文操作栏(CAB)(在Android 3.0及更高版本上)。
我的EditText直到最近确实这样做了:问题是现在长按EditText导致选中的单词被“拾取”,即拾取单词的放大“鬼”图像,你可以将其拖放到插入文本的其他位置。我根本没有触及EditText的代码。任何运行谷歌浏览器(桌面版)的人都可以看到我所说的行为类型,如果他们突出显示任何文本并用光标拖动它。
我认为问题可能是由于我的设备最近升级到Android 4.2.2。我一直在谷歌寻找信息,但它没有任何结果。此外,双击这个词也没有像预期的那样提升CAB - 它会闪烁一秒然后消失 - 但我不认为这是一个相关的问题。
我真的需要停止此行为,因为我的应用程序无法在没有CAB的情况下运行。所以问题是:我怎样才能恢复“正常”行为?在运行Android 4.2.2的Nexus 4上看到了所有行为。非常感谢所有帮助;非常感谢你!
EditText的XML布局代码:
<EditText
android:id="@+id/editor_mainText"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_above="@+id/options_bottom"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_below="@+id/options_top"
android:background="#FFE7E7E7"
android:imeOptions="flagNoExtractUi"
android:inputType="textMultiLine|textNoSuggestions|textVisiblePassword"
android:padding="8dp"
android:scrollbars="none"
android:textCursorDrawable="@null"
android:textSize="17sp"
android:typeface="monospace" >
<requestFocus />
</EditText>
答案 0 :(得分:0)
注意:我原来的答案有点不对劲。我没有在代码中发现我的粗心错误,但现在我有了,这就是为什么它不起作用
我已经解决了,但我绝对无法解释为什么这种行为首先发生,以及为什么这样做会产生任何不同。但无论如何,确实如此。
EditText已经扩展,以便使用Scroller和VelocityTracker使其“笨拙”。这涉及覆盖onTouchEvent(MotionEvent)。但代码中有一点错误,其中super.onTouchEvent(MotionEvent)将被调用两次,因为我不小心遗漏了其中一个中断; switch-case中的语句,但在MotionEvent.ACTION_MOVE事件期间除外。该应用程序工作正常,即使有这个错误一直到Android 4.2.1。我没有触及Android 4.2.2升级后的代码,但无论出于何种原因,在Android的新版本中,这个小错误引发了这种奇怪的行为。
所以基本上,这是一个非常基本的错误,现在我已经学会了:总是确保在一个带有break语句的switch-case中关闭一个案例!
答案 1 :(得分:0)
我面临几乎完全相同的行为。我无法找到关于stackoverflow的任何相关问题,因此将我的答案放在这里。 Maby对某人有用。因此,如果您遇到问题,那么在关闭复制/粘贴弹出窗口(通过单击屏幕上的任意位置)后,您将无法再次选择相同的文本(取而代之的是“ ghost”),您要做的就是手动禁用textIsSelectable
属性并在视图上再次启用它。为此,我在ActivityMain中使用了此代码。解决方案不好,但是对我有用
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
if (ev?.action == MotionEvent.ACTION_DOWN) {
val v = currentFocus
if (v is TextView || v is TextInputEditText) {
val outRect = Rect()
v.getGlobalVisibleRect(outRect)
if (!outRect.contains(ev.rawX.toInt(), ev.rawY.toInt())) {
val view = when (v) {
is TextView -> v
is TextInputEditText -> v
else -> null
}
view?.setTextIsSelectable(false)
view?.refreshDrawableState()
view?.setTextIsSelectable(true)
}
}
}
return super.dispatchTouchEvent(ev)
}