Android EditText长按行为

时间:2013-03-24 00:03:36

标签: android textview android-edittext android-4.2-jelly-bean long-press

我在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>

2 个答案:

答案 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)
}