Отключить мигающий курсор EditText

Ответы:

355

Вы можете использовать либо атрибут xml, android:cursorVisible="false"либо функцию java setCursorVisible(false).

Vic
источник
13
Круто, это вместе с onclicklistener, который делает его видимым, дает правильное поведение :)
Warpzit
1
@cerin есть ли способ скрыть синий маркер, чтобы я мог отключить вставку, но держать курсор видимым, чтобы пользователь видел, где он находится в поле?
Limlim
9
Можно ли отключить только мигание, а не курсор?
Android-разработчик
35

Идеальное решение, которое идет дальше к цели

Цель: отключить мигающий курсор, когда EditTextон не в фокусе, и включить мигающий курсор, когда он EditTextнаходится в фокусе. Ниже также открывается клавиатура при EditTextнажатии и скрывается при нажатии кнопки «Готово» на клавиатуре.

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;
            }
        });
coolcool1994
источник
6
KeyEvent.KEYCODE_ENTER не будет работать для всех клавиатур. Вам нужно будет конкретно указать android: imeOptions = "actionDone" в макете, а затем обработать EditorInfo.IME_ACTION_DONE.
PsyGik
Отличный ответ просто должен заменить щелчок на прикосновение, потому что какое-то время редактирование текста получает фокус без щелчка, поэтому в этом случае курсор не будет показан
Antwan
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);
}
MontiRabbit
источник
Уверен, что вы хотите, 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:focusableи android:focusableInTouchModeпоможет вам иншалла.

<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), используя

    android:focusableInTouchMode="true"
    android:focusable="true"
  2. установите addTextChangedListener для редактирования текста в Activity.

  3. и затем на последующем обмене Edittext положил edittext.clearFocus();

Это активирует курсор, когда клавиатура открыта, и отключается, когда клавиатура закрыта.

Бхавани ПК
источник
0

В kotlin your_edittext.isCursorVisible = false

Рохит Рохит
источник
Пожалуйста, отформатируйте разметку. Вы можете сделать это с помощью отступа кода на 4 пробела.
Данон
-1

. RootLayout.findFocus () clearFocus ();

Пратик Лахоти
источник