禁用EditText闪烁的光标


Answers:


354

您可以使用xml属性android:cursorVisible="false"或java函数setCursorVisible(false)


13
令人敬畏的是,这与使其可见的onclicklistener一起提供了正确的行为:)
Warpzit 2012年

1
@cerin有一种隐藏蓝色标记的方法,因此我可以禁用粘贴,但是保持光标可见,以便用户看到他在该字段中的什么位置?
2014年

9
是否可以仅禁用闪烁本身而不禁用光标?
Android开发人员

35

达到目标的完美解决方案

目标:当EditText焦点不对准时禁用闪烁的光标,并在焦点不对准时启用闪烁的光标EditTextEditText单击下面的按钮时,还会打开键盘,而在键盘中按完成时,它也会将其隐藏。

1)在您的xml下设置EditText

android:cursorVisible="false"

2)设置onClickListener:

iEditText.setOnClickListener(editTextClickListener);

OnClickListener editTextClickListener = new OnClickListener() 

{

    public void onClick(View v) 
    {
         if (v.getId() == iEditText.getId()) 
        {
            iEditText.setCursorVisible(true);
        }

    }
};

3)然后onCreate,在完成时使用压制捕获事件OnEditorActionListener到你EditText,然后setCursorVisible(false)

//onCreate...

iEditText.setOnEditorActionListener(new OnEditorActionListener() {

            @Override
            public boolean onEditorAction(TextView v, int actionId,
                    KeyEvent event) {
                    iEditText.setCursorVisible(false);
                if (event != null&& (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
                    InputMethodManager in = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    in.hideSoftInputFromWindow(iEditText.getApplicationWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);
                }
                return false;
            }
        });

6
KeyEvent.KEYCODE_ENTER不适用于所有键盘。您需要在布局中特别提及android:imeOptions =“ actionDone”,然后还要处理EditorInfo.IME_ACTION_DONE。
PsyGik 2014年

好的答案应该用触摸代替单击,因为有些时候编辑文本会获得焦点,而没有单击,因此在这种情况下将不会显示光标
Antwan 2016年

10

您可以使用以下代码通过编程来启用和禁用编辑文本光标。

启用光标

    editText.requestFocus();
    editText.setCursorVisible(true);

禁用光标

    editText.setCursorVisible(false);

使用XML启用禁用游标

   android:cursorVisible="false/true"
   android:focusable="false/true"

使edit_text可以选择(复制/剪切/粘贴/选择/全选)

   editText.setTextIsSelectable(true);

要专注于触摸模式,请在XML中编写以下几行

  android:focusableInTouchMode="true"
  android:clickable="true"
  android:focusable="true" 

以编程方式

  editText.requestFocusFromTouch();

清除对触摸模式的关注

  editText.clearFocus()

editText.clearFocus()是我想要的。谢谢!!+1
iUser

3

将游标可见性设置为true和false可能会出现问题,因为它将删除游标,直到您再次对其进行设置,并且同时字段是可编辑的,这不是很好的用户体验。

所以不要使用

setCursorVisible(false)

就这样做

        editText2.setFocusableInTouchMode(false)
        editText2.clearFocus()
        editText2.setFocusableInTouchMode(true)

上面的代码删除了焦点,这又删除了光标。并再次启用它,以便您可以再次触摸它并进行编辑。就像普通的用户体验一样。


2

就我而言,我想在聚焦编辑时启用/禁用光标。

在您的活动中:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
        View v = getCurrentFocus();
        if (v instanceof EditText) {
            EditText edit = ((EditText) v);
            Rect outR = new Rect();
            edit.getGlobalVisibleRect(outR);
            Boolean isKeyboardOpen = !outR.contains((int)ev.getRawX(), (int)ev.getRawY());
            System.out.print("Is Keyboard? " + isKeyboardOpen);
            if (isKeyboardOpen) {
                System.out.print("Entro al IF");
                edit.clearFocus();
                InputMethodManager imm = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(edit.getWindowToken(), 0);
            }

            edit.setCursorVisible(!isKeyboardOpen);

        }
    }
    return super.dispatchTouchEvent(ev);
}

一定要确保自己edit.setCursorVisible(!isKeyboardOpen);edit.setCursorVisible(isKeyboardOpen);这样,以便在存在键盘时可以看到光标。
丹尼尔·斯托姆

2

简单地将此行添加到您的父布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:focusable="true"
    android:focusableInTouchMode="true">

    <EditText
        android:inputType="text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

1

如果你想忽略Edittext从活动的开始,android:focusableandroid:focusableInTouchMode会帮助你inshallah。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/linearLayout7" android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:focusable="true" android:focusableInTouchMode="true">

LinearLayout与你有关Edittext


0
  1. 使用以下命令将焦点更改为另一个视图(例如:XML中的任何textview或Linearlayout)

    android:focusableInTouchMode="true"
    android:focusable="true"
  2. 在活动中将addTextChangedListener设置为edittext。

  3. 然后对Edittext进行修改之后edittext.clearFocus();

这将在打开键盘时启用光标,而在关闭键盘时禁用光标。


0

在kotlin中,your_edittext.isCursorVisible = false


请格式化标记。您可以通过将代码缩进4个空格来实现。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.