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

Я прочитал пару сообщений здесь, а также попытался погуглить. Но у меня все еще есть эта проблема:
я создал пользовательский диалог подкласса. Он содержит EditText и кнопку («ОК»). Я хочу, чтобы клавиатура отображалась автоматически после появления диалогового окна.

Мне удалось это сделать, поставив это:

imm = (InputMethodManager) EditDialog.this.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_NOT_ALWAYS);

в моем onCreate() пользовательского диалогового окна и

imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);

в моем отклонить().

Это открывает клавиатуру, когда появляется диалоговое окно, а также закрывает клавиатуру, когда я нажимаю кнопку «ОК».

Однако, если программная клавиатура открыта, и я нажму кнопку HOME на своем телефоне/эмуляторе, клавиатура останется открытой, поскольку, как я понял, я принудительно открываю ее с помощью SHOW_FORCED. Таким образом, я попытался скрыть (используя toggleSoftInput() из InputMethodManager) клавиатуру, если она открыта в методе onPause() родительской активности диалогового окна. кажется, что это возможно только с помощью обходного пути, как показано ЗДЕСЬ.

TL;DR: я хочу, чтобы виртуальная клавиатура отображалась при появлении диалогового окна с EditText и кнопкой (сосредоточьтесь на EditText). У меня это заработало, но пришлось написать много хаков, чтобы закрыть его должным образом.

Изменить: я основывал свой код на ЭТО


person coffecup    schedule 04.04.2011    source источник
comment
Возможный дубликат: stackoverflow.com/questions/ 4258623/   -  person SparK    schedule 31.08.2015


Ответы (4)


На это был дан ответ здесь, и у меня это отлично работает. Если я нажимаю кнопку «Домой» во время отображения клавиатуры, она корректно скрывается после нажатия клавиши «Домой».

person Shawn Lauzon    schedule 26.04.2011

@Override
public void onResume() {
    super.onResume();
    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            try {
                InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.toggleSoftInputFromWindow(view.getWindowToken(), InputMethodManager.SHOW_FORCED, 0);
            } catch (Exception e) {

            }
        }
    }, 300);
}

И "представление" типа EditTextView. «контекст» — это текущий контекст.

Желание может помочь вам.

person Chen Brokge    schedule 28.04.2016

Вы можете использовать этот класс KeyboardHelper.java для отображения и скрытия клавиатуры.

    import android.content.Context;
    import android.view.View;
    import android.view.inputmethod.InputMethodManager;
    import android.widget.EditText;

    /**
     * Created by khanhamza on 06-Mar-17.
     */

    public class KeyboardHelper {

        public static void hideSoftKeyboard(Context context, View view) {
            if (context == null || view == null) {
                return;
            }

            InputMethodManager imm = (InputMethodManager) context
                    .getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);

        }


        public static void hideSoftKeyboardForced(Context context, View view) {
            if (context == null) {


  return;
        }

        InputMethodManager imm = (InputMethodManager) context
                .getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromInputMethod(view.getWindowToken(), 0);

    }

    public static void hideSoftKeyboard(Context context, EditText editText) {
        if (context == null) {
            return;
        }
        InputMethodManager imm = (InputMethodManager) context
                .getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(editText.getWindowToken(), InputMethodManager.HIDE_IMPLICIT_ONLY);
    }

    public static void showSoftKeyboard(Context context, EditText editText) {

        if (context == null) {
            return;
        }

        InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
        editText.requestFocus();
    }

    public static void showSoftKeyboardForcefully(Context context, EditText editText) {

        if (context == null) {
            return;
        }

        InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);
        editText.requestFocus();
    }




}
person Hamza Khan    schedule 19.08.2019

person    schedule
comment
Не могли бы вы также объяснить свое решение словами? - person Magnilex; 09.04.2015