IDOL1234
@IDOL1234

Как убрать автоматическое отображение клавиатуры при запуске активити с EditText?

Ситуация:
Есть LinearLayout с EditText. При запуске активити, фокус устанавливается на это поле ввода, но клавиатура не раскрываестя. Если под EditText добавить ListView, при запуске клавиатура отображается и закрывает его, что крайне нежелательно.
Если закрыть клавиатуру в портретной ориентации, при переходе на альбомную она открывается снова.
Если закрыть её в альбомной ориентации, при переходе на портретную она не появляется (layout.xml один).

<requestFocus /> удалил.

Создать вложенный невидимый layout, захватывающий фокус, перед полем ввода — не вариант, мне нужно, чтобы фокус был на EditText.

Сейчас используется
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
в onCreate(), но это выглядит диким костылём.

Как сделать это нормально?..
  • Вопрос задан
  • 25162 просмотра
Решения вопроса 1
zorgrhrd
@zorgrhrd

Добавить в AndroidManifest.xml, для нужного activity: android:windowSoftInputMode="stateHidden"

Ответ написан
Пригласить эксперта
Ответы на вопрос 3
alexxxst
@alexxxst
final EditText editText = (EditText) findViewById(R.id.edit_text);
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
Ответ написан
Комментировать
@jimpanzer
del
Ответ написан
Комментировать
hyperax
@hyperax
разработчик под Android

Тоже долго ломал голову над этой проблемой. Перебрал множество способов, но все они имели проблемы совместимости с версиями платформы. В итоге остановился на обработчике onTouchListener для EditText'а:


    editText.setOnTouchListener(onTouchListener);

    View.OnTouchListener onTouchListener = new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            editTextPinCode.setFocusable(true);
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    Layout layout = ((EditText) v).getLayout();
                    float x = event.getX() + editTextPinCode.getScrollX();
                    int offset = layout.getOffsetForHorizontal(0, x);
                    if(offset>0)
                        if(x>layout.getLineMax(0))
                            editTextPinCode.setSelection(offset);
                        else
                            editTextPinCode.setSelection(offset - 1);
                    break;
            }
            return true;
        }
    };

Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы