Курсор 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.