#android #keyboard
#Android #клавиатура
Вопрос:
Я хочу имитировать поведение клавиатуры Android при обработке события касания. Клавиатура Android всегда скрывается каждый раз, когда я нажимаю где-то еще, кроме редактируемого текста и клавиатуры. До сих пор я мог имитировать это поведение, используя dispatchTouchEvent
Поскольку он будет обнаруживать даже для любого касания отправки, всякий раз, когда я нажимаю кнопку на клавиатуре, он сам закрывает клавиатуру. Я хочу проверить, нажимаю ли я где-нибудь еще, кроме своей клавиатуры, затем скрываю клавиатуру, иначе оставляю клавиатуру включенной. Я думаю, что я просто пропустил фрагмент кода, и я не могу найти то, что я пропустил здесь. Для этого нужен всего один шаг. Пожалуйста, помогите.
Здесь моя клавиатура выглядит так
и вот что я сделал до сих пор
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (getCurrentFocus() != null) {
View view = getCurrentFocus();
//im not sure this condition would help
if (view == null) {
keyboard.setVisibility(View.GONE);
}
}
return super.dispatchTouchEvent(ev);
}
Я могу получить объект view, но я не могу определить, в каком представлении мне нужно сохранить клавиатуру.
Другой код (объявление переменной)
PhoneKeyboard pk;
InputConnection ic;
LinearLayout keyboard;
pk = findViewById(R.id.phone_keyboard);
ic = phone_no.onCreateInputConnection(new EditorInfo());
pk.setInputConnection(ic);
Обработка нажатия назад (имитирует поведение клавиатуры Android)
@Override
public void onBackPressed(){
if(keyboard.getVisibility() == View.GONE)
super.onBackPressed();
else
keyboard.setVisibility(View.GONE);
}
Как я обрабатываю запрос в EditText, чтобы сделать мою клавиатуру видимой
phone_no.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
InputMethodManager imm = (InputMethodManager) getApplicationContext().getSystemService(
android.content.Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
if(view.equals(phone_no) amp;amp; keyboard.getVisibility() == View.GONE) {
phone_no.requestFocus();
keyboard.setVisibility(View.VISIBLE);
}
return false;
}
});
Как я обрабатываю событие отправки / ввода на моей пользовательской клавиатуре (для тех, кому нужно решение для пользовательской клавиатуры, возможно, этот пост может помочь другим :))
phone_no.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
InputMethodManager imm = (InputMethodManager) getApplicationContext().getSystemService(
android.content.Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
if(view.equals(phone_no) amp;amp; keyboard.getVisibility() == View.GONE) {
phone_no.requestFocus();
keyboard.setVisibility(View.VISIBLE);
}
return false;
}
});
Вот мой фрагмент кода для представления раскладки клавиатуры
<include
layout="@layout/layout_keyboard_phone_no"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusableInTouchMode="false"
app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
Ps. У меня также есть базовая активность, и она распространяется на все мои действия (если для вашего решения требуется базовая активность)
Обновление 1
Я попробовал этот метод
phone_no.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
keyboard.setVisibility(View.GONE);
}
}
});
Делает то же самое с событием onDispatch, всякий раз, когда я нажимаю номер на своей пользовательской клавиатуре, он также скрывает клавиатуру. Мне нужно проверить, отображается ли вид, отличный от текста редактирования и моей пользовательской клавиатуры, затем скрыть клавиатуру, чтобы сохранить клавиатуру включенной. Спасибо