Видимость пользовательского набора клавиатуры исчезла при отправке события касания из EditText

#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, всякий раз, когда я нажимаю номер на своей пользовательской клавиатуре, он также скрывает клавиатуру. Мне нужно проверить, отображается ли вид, отличный от текста редактирования и моей пользовательской клавиатуры, затем скрыть клавиатуру, чтобы сохранить клавиатуру включенной. Спасибо