Android: диалоговое окно автоматически отображает программную клавиатуру, когда фокус находится на EditText, который не работает

Android: автоматическое отображение программной клавиатуры когда фокус находится на EditText

Я прочитал этот пост, который автоматически показывает виртуальную клавиатуру при отображении диалогового окна. однако это не работает для меня. есть идеи почему? даже несмотря на то, что текст редактирования автоматически оказывается в фокусе при появлении диалогового окна, событие не запускается. Я также прочитал ответ onpostresume, но не знаю, как его применить. любая помощь приветствуется.

final Dialog dialog = new Dialog(ThesisI.this);
        dialog.setContentView(R.layout.budget_dialog);


        final EditText et = (EditText) dialog.findViewById(R.id.textComments);
        final Button enter = (Button) dialog.findViewById(R.id.buttonEnter);
        final Button cancel = (Button) dialog.findViewById(R.id.buttonCancel);

        enter.setOnClickListener(new View.OnClickListener() {
      @Override
   public void onClick(View v) {

      }
        });
        /**cancel */
        cancel.setOnClickListener(new View.OnClickListener() {
      @Override
   public void onClick(View v) {
   }
        });       
        dialog.show(); 

        et.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus) {
                  dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

                }
            }
        });

однако я заметил, что если я изменю фокус на кнопку, то снова сосредоточусь на тексте редактирования. это событие работает, используя этот код ниже.

et.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus) {
                   InputMethodManager inputMgr = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                      inputMgr.toggleSoftInput(0, 0);
                }
            }
        });

любая идея о том, как его применить?


person John Paul    schedule 26.10.2010    source источник


Ответы (2)


Что вы можете сделать, это попробовать использовать postDelayed(Runnable) для EditText, как показано ниже,

                ettext.requestFocus();
                ettext.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        InputMethodManager keyboard = (InputMethodManager)
                        getSystemService(Context.INPUT_METHOD_SERVICE);
                        keyboard.showSoftInput(ettext, 0);
                    }
                },200);
person Lalit Poptani    schedule 16.12.2011
comment
Мне было достаточно просто post(), который, по-видимому, отбрасывает его в конец очереди после того, как представление становится видимым. Я вообще очень осторожен с магическими значениями и произвольными задержками. - person EboMike; 30.12.2014

Просто попробуйте добавить строку ниже перед "et.setOnFocusChangeListener"

((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE))
                    .showSoftInput(et, 2);
person Vishal Arya    schedule 06.12.2010