Фокус и клавиатура в EditText
При повторном нажатии на EditText с фокусом и уже открытой клавиатурой, клавиатура и фокус на долю секунды пропадают и появляются заново, получается что клавиатура как-то "выпрыгивает", не нравится глазу. Посмотрел другие приложения, например "Поиск" в TikTok, там такого исчезновения и появления нет. Это можно как то настроить?
UPD: Убрал эту часть кода, "обновление" пропало, но этот метод позволял убирать фокус с клавиатурой просто по клику на экран, и был достаточно важным, его можно как то по другому реализовать ?
@Override
public boolean dispatchTouchEvent(@NonNull MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
View v = getCurrentFocus();
if (v instanceof EditText) {
v.clearFocus();
InputMethodManager imm = (InputMethodManager) getBaseContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
}
return super.dispatchTouchEvent(event);
}
Ответы (1 шт):
Можно добавить слушатель который будет проверять наличие фокуса у поля для ввода:
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
}
});
таким образом, если фокуса нет то показывать клавиатуру. Так же для проверки видимости клавиатуры можно воспользоваться этим и этим способами.
UPDATE
Убирать фокус при клике можно кликнув на родительский макет поля для ввода, вот например так:
FrameLayout touchInterceptor = (FrameLayout)findViewById(R.id.touchInterceptor);
touchInterceptor.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (mEditText.isFocused()) {
Rect outRect = new Rect();
mEditText.getGlobalVisibleRect(outRect);
if (!outRect.contains((int)event.getRawX(), (int)event.getRawY())) {
mEditText.clearFocus();
InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
}
}
return false;
}
});
так же в xml можно добавить такие поля:
android:focusableInTouchMode="true"
android:clickable="true"
android:focusable="true"
Вот вопрос по данной тематике.