2

我在使用 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>
4

2 回答 2

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 中的 case!

于 2013-03-24T00:33:10.437 回答
0

我面临几乎完全相同的行为。我找不到关于 stackoverflow 的任何相关问题,所以将我的答案放在这里。也许它会对某人有用。因此,如果您遇到问题,在关闭复制/粘贴弹出窗口(通过单击屏幕上的任意位置)后,您将无法再次选择相同的文本(取而代之的是“幽灵”)您所要做的就是手动禁用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)
}
于 2020-12-18T15:41:04.473 回答