Курсор Edittext все еще мигает после закрытия мягкой клавиатуры

Должен ли курсор edittext продолжать мигать после закрытия мягкой клавиатуры или это результат тестирования на эмуляторе и не произойдет на самом устройстве? - как указано во втором сообщении в это обсуждение

Обновление:

Я знаю, что edittexts все еще мигает курсором, потому что они все еще находятся в фокусе - регистрируется сообщение всякий раз, когда edittext потерял фокус, но сообщение никогда не регистрировалось при закрытой мягкой клавиатуре.

Обновление:

Я пробовал:

@Override
public void onBackPressed() {
    super.onBackPressed();
    getCurrentFocus().clearFocus();
}

Таким образом, каждый раз, когда клавиатура закрывается, EditText в данный момент находится в фокусе, теряет фокус и onFocusChanged() вызывается. Проблема заключается в том, что onBackPressed() не вызывается, когда кнопка возврата нажата, когда клавиатура вставлена. Я знаю это, потому что я поставил тост в onBackPressed(), и нет тоста, когда нажата кнопка "Назад", пока клавиатура встала.

Ответ 1

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

public class EdittextListner extends EditText {

private KeyImeChange keyImeChangeListener;

public EdittextListner(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public void setKeyImeChangeListener(KeyImeChange listener) {
    keyImeChangeListener = listener;
}

public interface KeyImeChange {
    public boolean onKeyIme(int keyCode, KeyEvent event);
}

@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
    if (keyImeChangeListener != null) {
        return keyImeChangeListener.onKeyIme(keyCode, event);
    }
    return false;
}

}

Во-вторых, измените свой EditText на EdittextListner в вашем файле макета.

Наконец, сделайте следующее

 mLastNameEditText.setKeyImeChangeListener(new EdittextListner.KeyImeChange() {
        @Override
        public boolean onKeyIme(int keyCode, KeyEvent event) {
            mLastNameEditText.clearFocus();
            return true;
        }
    });

Это сработало для меня. Надеюсь, что это поможет

Ответ 2

Как вы сказали, мигающий курсор в EditText связан с фокусом EditText, но показ или скрытие мягкой клавиатуры не коррелирует с View увеличением или потерей фокуса. Любые View (EditText или иначе) могут быть сфокусированы независимо от того, отображается или нет мягкая клавиатура, и нет никакого значения для EditText, из-за чего он будет вести себя по-другому.

Если вы хотите EditText потерять фокус всякий раз, когда мягкая клавиатура скрыта, вам нужно будет реализовать эту функцию самостоятельно, прослушивая изменения в видимости мягкой клавиатуры и обновляя EditText.

Ответ 3

Единственный способ узнать, что клавиатура исчезла, - это переопределить OnglobalLayout и проверьте высоту. Основываясь на этом событии, вы можете "setCursorVisible (false)" в тексте редактирования

Ответ 4

Для получения дополнительной информации, проверьте Ссылка.

RelativeLayout mainLayout = findViewById(R.layout.main_layout); // You must use the layout root
InputMethodManager im = (InputMethodManager)  getSystemService(Service.INPUT_METHOD_SERVICE);

/*
Instantiate and pass a callback
*/
SoftKeyboard softKeyboard;
softKeyboard = new SoftKeyboard(mainLayout, im);
softKeyboard.setSoftKeyboardCallback(new SoftKeyboard.SoftKeyboardChanged()
{

@Override
public void onSoftKeyboardHide() 
{
    // Code here
  EditText.clearFocus();
}

@Override
public void onSoftKeyboardShow() 
{
    // Code here
}   
});

/*
Open or close the soft keyboard easily
*/
softKeyboard.openSoftKeyboard();
softKeyboard.closeSoftKeyboard();

/* Prevent memory leaks:
*/
@Override
public void onDestroy()
{
super.onDestroy();
softKeyboard.unRegisterSoftKeyboardCallback();
}

Ответ 5

Edittext - это вид, который принимает ввод от пользователя, поэтому он не связан с открытием или закрытием keyborad, когда пользователь нажимает на edittext, что edittext получит фокус, и курсор начнет мигать для ввода ввода,

Итак, вы можете сделать одно: когда вы закрываете клавиатуру одновременно, вы также можете установить видимость курсора для этого edittext, чтобы он переставал мигать,

Для этого вам нужно написать строку ниже, когда вы скрываете клавиатуру.

    editTextObject.setCursorVisible(false);

Это заставит курсор мигать.

Ответ 6

попробуйте следующее:

public class EditTextBackEvent extends EditText {

private EditTextImeBackListener mOnImeBack;

public EditTextBackEvent(Context context) {
    super(context);
}

public EditTextBackEvent(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public EditTextBackEvent(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
    if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
        if (mOnImeBack != null) mOnImeBack.onImeBack(this, this.getText().toString());
    }
    return super.dispatchKeyEvent(event);
}

public void setOnEditTextImeBackListener(EditTextImeBackListener listener) {
    mOnImeBack = listener;
}

public interface EditTextImeBackListener {
    void onImeBack(EditTextBackEvent ctrl, String text);
}
  }

в вашем макете:

<yourpackagename.EditTextBackEvent
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                />

и в вашем фрагменте:

edittext.setOnEditTextImeBackListener(new EditTextBackEvent.EditTextImeBackListener()
    {
        @Override
        public void onImeBack(EditTextBackEvent ctrl, String text)
        {
           edittext.clearfocus();
        }
    });

Ответ 7

Попробуйте сохранить представление в своем макете, которое будет фокусироваться над вашим текстовым редактором.

<View
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:focusable="true"
    android:focusableInTouchMode="true" />

Это должно работать, поскольку пустой фокусный вид должен захватывать фокус, а не ваш edittext.