【问题标题】:Android EditText - Editable but not Selectable?Android EditText - 可编辑但不可选择?
【发布时间】:2016-03-30 15:42:27
【问题描述】:

是否可以使 EditText 可编辑但不可选择?我希望能够编辑一些文本,然后在页面上拖动它。它可以工作,但是当你拖动它时,这算作长按,所以它会选择一些文本。

当我单击 EditText 时,我是否必须做一些事情,比如让另一个视图出现,让它捕获触摸事件,然后在事件操作启动时隐藏它并将焦点返回到 editText?这看起来很老套/过于复杂。

【问题讨论】:

  • 您是否尝试从侦听器中的 onLongClick 事件返回 true,以便该事件不会继续到 EditText 的默认 onLongClickListener?
  • 不是长按事件,是触摸事件,但是TextView类有一个固有的longclicklistener。我试图告诉它为 ACTION_DOWN 返回 true,但它只是移动编辑文本,并没有进入编辑模式或拉起键盘

标签: android android-edittext touch-event selectable


【解决方案1】:

使用setTextIsSelectable(false) 实现了所需的行为。诀窍是先运行setTextIsSelectable(true)。它克服了 SDK 中的错误/功能(如果您有兴趣,请调试此方法)。在 Android 7.1.1 上测试。

editText.setTextIsSelectable(true); // needed in order to next line work properly
editText.setTextIsSelectable(false);

// restore soft keyboard functionality broken by previous line
editText.setFocusableInTouchMode(true);
editText.setFocusable(true);
editText.setClickable(true);

【讨论】:

    【解决方案2】:

    也许不完全是您正在寻找的解决方案,但是当 EditText 放置到位时,您可以通过调用 editText.clearFocus(); 来确保没有选择

    如果您需要保留在拖动之前存在的选择,这将是一个问题,但如果您只是想确保选择被清除,则不是。

    【讨论】:

      【解决方案3】:

      这应该可以:android:textIsSelectable="false"

      第二种可能的解决方案是将消耗事件的 onLongClickListener 置空。

      OnLongClickListener longClickListener = new OnLongClickListener() {
          @Override
          public boolean onLongClick(View v) {\
              return true; //true = event consumed, false = event not consumed
          }
      };
      

      【讨论】:

      • 我试过这个。它不起作用,某些东西正在覆盖它。我在 xml 和编程中做到了
      【解决方案4】:
      EditText myEditText = (EditText) findViewById(R.id.my_edit_text);
      myEditText.setTextIsSelectable(false);
      

      【讨论】:

      • 你能解释一下你的答案吗?
      • 我原以为这是不言自明的。例如,您可以在活动的 onCreate() 方法中使用它。第一行检索 EditText,第二行使其无法在长按时选择,尽管双击仍然有效。与 Vladimir 的建议(在您的 xml 中使用 android:textIsSelectable="false")相比的优势在于,如果您希望能够打开和关闭该属性。
      • 这个解释不适合我。我推荐是因为你的答案被标记为低质量,你可以解释你的答案对于任何想要解决类似问题的用户来说会更好。
      • 我试过了。你会认为这样做可以,但在我的情况下这行不通。
      【解决方案5】:

      我找到了一个比我上面提到的解决方案稍微简单的解决方案,然后尝试了(但没有成功),但这确实有效:

      先这样做,

      image_text.cancelLongPress();
      

      这显然会取消任何继承的点击,而不仅仅是长点击,即它显示光标,并且它不选择任何文本,但它也不会调出键盘,但这很容易:

      View v = activity.getWindow().getCurrentFocus();
              if (v != null) {
                  InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
                  imm.showSoftInput(v, 0);
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 2014-06-11
        • 2023-03-05
        • 2010-12-12
        相关资源
        最近更新 更多