Отображение курсора внутри EditText, когда фокус не находится на EditText

Image of a grid-like layout

Я работаю над приложением Android Smart TV:

  • В view есть пользовательская клавиатура и EditText.

  • При запуске приложения фокус переходит на клавиатуру.

    Желаемая:

    • Когда пользователь печатает с клавиатуры (щелкая пультом), курсор также должен мигать внутри editText.

Как я могу показать этот эффект внутри EditText?

Ответ 1

вы можете это сделать. Я надеюсь/думаю, что у вас есть макет для кнопок u, которые вы создали, этим вы можете установить прослушиватель фокуса для этого макета и внутри метода onFocusChange, и вы можете проверить if (layout.hasFocus()) и сделай это...

Например, если ur edittext называется et, вы можете установить это для него:

et.setActivated(true);
et.setPressed(true);

У меня есть небольшой пример кода для u, у которого есть два текста редактирования

 et2.setOnFocusChangeListener(new OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {

            if(et2.hasFocus()){

                //et1.setCursorVisible(true);
                et1.setActivated(true);
                et1.setPressed(true);

            }
        }
    });

Надеюсь это поможет...

Ответ 2

Это происходит, если вы установите фон для поля. Если вы хотите решить эту проблему, установите cursorDrawable на @null.

Вы должны добавить textCursorDrawable с помощью cursorVisible.

Ссылка на чертеж, который будет нарисован под курсором вставки.

android:cursorVisible="true"
android:textCursorDrawable="@null"

Ответ 3

Вы можете попробовать что-то вроде этого:

editText.setText(text);
editText.setPressed(true);
editText.setSelection(editText.getText().length()); // moves the cursor to the end of the text

Однако с этим подходом есть две проблемы:

  1. Курсор не будет мигать. Логика мигания находится в классе Editor и не может быть переопределена. Для этого требуется, чтобы EditText был сфокусирован, и только одно изображение можно сфокусировать сразу в окне - в вашем случае это будет одна из клавиш клавиатуры.

    /**
     * @return True when the TextView isFocused and has a valid zero-length selection (cursor).
     */
    private boolean shouldBlink() {
        if (!isCursorVisible() || !mTextView.isFocused()) return false;
        ...
    }
    
  2. Курсор не всегда будет виден. Мигание курсора основано на системном времени - оно отображается на полсекунды и скрывается в течение следующих полусекунд. Курсор будет отображаться только в том случае, если код, указанный выше, вызывается в момент времени, когда курсор будет виден в соответствии с системным временем.

Вот почему родная клавиатура /IME работает так, как она есть. Это отдельное окно, которое позволяет EditText сохранять фокус и иметь мигающую функцию курсора, в то время как пользователь нажимает на "Виды" в другом окне (клавиатура /IME).

При этом существует проблема, связанная с описанными выше проблемами: убедитесь, что значение shouldBlink установлено в false, когда вам это больше не нужно, это гарантированная утечка памяти или сбоя в противном случае:

private void blink() {
    if (shouldBlink) {
        editText.setText(editText.getText());
        editText.setPressed(true);
        editText.setSelection(editText.getText().length());

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                if (shouldBlink) {
                    blink();
                }
            }
        }, 500);
    }
}

Ответ 4

В вашем XML файле макета добавьте следующую строку в текст редактирования:

<requestFocus/>

Это поместит курсор в ваш виджет editText.

Надеюсь, поможет.

Ответ 5

Существует несколько способов сделать это:

1) XML

android:cursorVisible="true"

2) Java

mEditText.setOnClickListener(editTextClickListener);
OnClickListener editTextClickListener = new OnClickListener() {

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

or

if (mEditText.hasFocus()){
    mEditText.setCursorVisible(true);
}

Ответ 6

Вы можете использовать следующий код в своей деятельности:

//Get the EditText using
EditText et = (EditText)findViewById(R.id.editText); 

//Set setCursorVisible to true
et.setCursorVisible(true);

Ответ 7

You can explicitly put caret to last position in text:
            int pos = editText.getText().length();
            editText.setSelection(pos);

Это всегда будет сосредоточено на первом символе на edittext.

             android:focusable="true"

Ответ 8

Я знаю, что это некро, но это было намного лучше, чем решения выше. Просто расширьте EditText и добавьте:

  @Override
  public boolean isCursorVisible() {
    return true;
  }

  @Override
  public boolean isFocused() {
    return true;
  }

И в вашем XML:

  <com.foo.MyEditText
    ...
    android:focusable="false"
    android:focusableInTouchMode="false"
    android:clickable="false"
    android:cursorVisible="true"/>

Теперь EditText думает, что он сфокусирован и курсор виден, но на самом деле он не может быть сфокусирован.

Ответ 9

    private void setFocusCursor(){
  mBinding.replyConversationsFooter.footerEditText.setFocusable(true);
  'mBinding.replyConversationsFooter.footerEditText.setFocusableInTouchMode(true);'
 'mBinding.replyConversationsFooter.footerEditText.requestFocus();' 
    }

Просто вызовите эту функцию в oncreateView() и все. Мы можем установить только один и только фокус на окне. Это поможет вам решить вашу проблему.

Ответ 10

Протестировано на эмуляторе API 27, 28.

Удалите атрибут background, добавьте focusable:

<EditText
    ...
    android:focusable="true"
    android:focusableInTouchMode="true"
    />

В коде напишите: edit.requestFocus(); Хотя подчеркивание будет видно.

Чтобы удалить подчеркивание, см. fooobar.com/questions/27200/...:

edit.getBackground().mutate().setColorFilter(ContextCompat.getColor(getContext(), R.color.white), PorterDuff.Mode.SRC_ATOP);

Чтобы изменить цвет курсора, см. fooobar.com/questions/15384828/...:

добавить android:textCursorDrawable="@drawable/shape_cursor", тогда как shape_cursor:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <size
        android:width="1dp"
        android:height="25dp"
        />
    <solid android:color="@color/gray" />
</shape>

Он работает на эмуляторе API 27, 28, но на реальном устройстве (API 21) курсор исчезает. Я пробовал много вариантов здесь и там, но ничего не помогло.

Затем я заметил, что когда EditText содержит хотя бы один символ, он показывает курсор. Я добавил TextWatcher, чтобы добавить пробел, когда ничего не вводилось.

private lateinit var someText: String

...
edit.requestFocus()
edit.setText(" ")
edit.addTextChangedListener(YourTextWatcher())


private inner class YourTextWatcher : TextWatcher {

    override fun afterTextChanged(s: Editable?) {
        someText = s.toString().trim()
        if (someText.isEmpty()) {
            // To not fall into infinite loop.
            if (s?.length != 1) {
                edit.setText(" ")
            }
        } else {
        }
    }

    override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}

    override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
}

Также вы можете добавить отступы, чтобы нажать внутри EditText, если он маленький.

Ответ 11

просто добавьте

editText.requestFocus();