Android отображает представление и скрывает клавиатуру одновременно. Странное поведение

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

Мне нужно открыть клавиатуру, нажать кнопку, скрыть клавиатуру и показать другой вид в том же месте, что и клавиатура.

У меня это реализовано прямо сейчас, только с клавиатурой скрыть и показать пользовательский вид, но имеет странное поведение и минимальное отставание и перекрытие.

Кто-то реализовал подобный материал?

Ответ 1

Я проверил проект Github и нашел ошибку, и я исправил эту ошибку со следующим кодом:

if (isRedPanelVisible()) {
    showRedPanel(false);
    showKeyboard(true, new KeyboardCallback() {
        @Override
        public void onKeyboardDone(boolean isVisible) {

        }
    });
}
if (KeyboardVisibilityEvent.isKeyboardVisible(TestActivity.this)) {
    hideKeyboard(TestActivity.this);
    new android.os.Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            showRedPanel(true);
        }
    }, 100);

Примечание. Вам просто нужно поместить это в TestActivity.java под событие нажатия кнопки и удалить предыдущий код.

Что я сделал

если ваша readPanel видна, то я вызвал showRedPanel на false и попытаюсь открыть клавиатуру.

После этого я добавил чек для события видимости клавиатуры и, если клавиатура видна, я вызвал hideKeyboard чтобы заставить клавиатуру уйти и вызвать showReadPanel с true после задержки 100 мс

Код: hideKeyboard

public void hideKeyboard(Activity activity) {
        // Check if no view has focus:
        try {
            View view = activity.getCurrentFocus();
            if (view != null) {
                InputMethodManager inputManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
                inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
            }
        } catch (Exception e) {

        }
    }

Ответ 2

Итак, что происходит в вашем коде, так это то, что: Скажите системе, чтобы закрыть клавиатуру -> Показать красную панель с небольшой задержкой -> Красная панель отображается до закрытия клавиатуры -> Поскольку режим клавиатуры находится в adjustResize красную панель, показанную над клавиатурой -> Клавиатура закрыться -> Все на месте

Попытайтесь изменить windowSoftInputMode в манифесте с помощью adjustResize чтобы adjustNothing.

К сожалению, клавиатура в Android не работает плавно, как в IOS, клавиатура обрабатывается ОС, потому что вы не контролируете ее размер, анимацию открытия/закрытия и обратный вызов! Поэтому лучший способ - всегда показывать красную панель и при необходимости открывать клавиатуру поверх нее.

Ответ 3

выполните следующие функции, чтобы показать/скрыть клавиатуру:

/**
 * Hides the soft keyboard
 */
public void hideSoftKeyboard() {
    if(getCurrentFocus()!=null) {
        InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
    }
}

/**
 * Shows the soft keyboard
 */
public void showSoftKeyboard(View view) {
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
    view.requestFocus();
    inputMethodManager.showSoftInput(view, 0);
}