Автоматическая всплывающая клавиатура при запуске Activity

99

У меня относительно простой вопрос. У меня есть активность, в которой много EditText. Когда я открываю действие, оно автоматически фокусируется на первом EditText и отображает виртуальную клавиатуру.

Как я могу предотвратить это?

Галип
источник
Проверьте мой ответ на этот вопрос stackoverflow.com/questions/39593324/…
Справка по Android
Когда «Мое приложение» запущено (открыто) и если доступен режим редактирования текста, клавиатура автоматически (показывать) включена. Как решить эту проблему, нажмите здесь easycomacademy.com/…
Ахмад Улла Ахмад

Ответы:

210

Используйте эти атрибуты в теге макета в файле XML:

android:focusable="true"
android:focusableInTouchMode="true"

Как сообщили другие участники в комментариях, он не работает, ScrollViewпоэтому вам необходимо добавить эти атрибуты к основному дочернему элементу ScrollView.

Викас Патидар
источник
3
Это также устранило мою проблему. Я добавил это в тег RelativeLayout для своей деятельности. Спасибо!
Люк
21
Интересно, что это не сработало, когда я добавил вышеупомянутое в ScrollView, но это сработало для LinearLayout
Джерри Брэди,
1
Я думаю, вам нужно поместить это на самый верхний макет
Утсав Гупта
Полагаю, это работает, потому что вы говорите самому макету, что он может иметь фокус? В противном случае предполагается, что необходимо сосредоточить внимание на первом элементе управления в форме? Как ни странно, я получал клавиатуру, даже если все элементы управления в моей форме были отключены. Исправлено сейчас. Спасибо!
Crowmagnumb
1
Важно отметить, что это решение создает проблемы с доступностью (представление, на котором нельзя сфокусироваться, отмечается как имеющее фокус) и может иметь непредвиденные последствия.
Ренато
97

Вы можете добавить это в свою деятельность Android Manifest:

android:windowSoftInputMode="stateHidden|adjustResize"
UKDataGeek
источник
Это работает, однако, если у вас есть фон изображения и вы беспокоитесь о том, что ваша мягкая клавиатура сжимает такой фон изображения, используйтеandroid:windowSoftInputMode="stateHidden|adjustPan"
ArtiomLK
31

У меня есть несколько реализаций описаны здесь, но теперь я уже добавлен в AndroidManifest.xmlмоей Activityсобственности:

android:windowSoftInputMode="stateAlwaysHidden"

Я думаю, что это простой способ, даже если вы используете fragments.

" stateAlwaysHidden " Программная клавиатура всегда скрыта, если в главном окне действия есть фокус ввода.

Jorgesys
источник
это сработало для меня как с ScrollView, так и с RelativeLayout.
iversoncru
Это не так хорошо для фрагментов, так как вы связываете «скрытое состояние» с действием, которое будет содержать все ваши фрагменты, а это означает, что на любой фрагмент, который вы хотите отобразить в действии, будет влиять свойство (не на «для каждого фрагмента»). "основа).
Pelpotronic
11

Если у вас есть другое представление о вашей деятельности, например ListView, вы также можете:

ListView.requestFocus(); 

в вашем onResume (), чтобы захватить фокус с editText.

Я знаю, что на этот вопрос был дан ответ, но я просто предлагаю альтернативное решение, которое сработало для меня :)

Сид
источник
5

https://stackoverflow.com/a/11627976/5217837 Это почти правильно:

@Override
public void onCreate(Bundle savedInstanceState) {

getWindow().setSoftInputMode(
   WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

}

Но это должно быть SOFT_INPUT_STATE_HIDDEN, а не SOFT_INPUT_STATE_ALWAYS_VISIBLE

Брент Янг
источник
4

Используйте это в коде своей деятельности:

@Override
public void onCreate(Bundle savedInstanceState) {

getWindow().setSoftInputMode(
   WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

}
Бобы
источник
У меня это не сработало - клавиатура все еще выскакивала, когда я начинал свою деятельность.
Дэвид Дориа,
Вы можете проверить эту ссылку, она будет работать: stackoverflow.com/questions/18977187/…
Суджет Кумар Гупта
3

У меня была похожая проблема, даже при переключении вкладок клавиатура выскакивала автоматически и оставалась открытой с Android 3.2.1 на планшете. Используйте следующий метод:

public void setEditTextFocus(EditText searchEditText, boolean isFocused)
{
    searchEditText.setCursorVisible(isFocused);
    searchEditText.setFocusable(isFocused);
    searchEditText.setFocusableInTouchMode(isFocused);
    if (isFocused) {
        searchEditText.requestFocus();
    } else {
        InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
        inputManager.hideSoftInputFromWindow(searchEditText.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS );
    }
}   

В onCreate () и onPause () действия для каждого EditText:

setEditTextFocus (myEditText, ложь);

Для каждого EditText OnTouchListener:

    myEditText.setOnTouchListener(new EditText.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            setEditTextFocus(myEditText, true); 
            return false;
        }
    });

Для каждого EditTextв OnEditorActionListener:

    myEditText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
                            .......
            setEditTextFocus(myEditText, false); 
            return false;
        }
    });

И для каждого EditTextв layout xml:

            android:imeOptions="actionDone"
            android:inputType="numberDecimal|numberSigned" // Or something else

Вероятно, возможна дополнительная оптимизация кода.

Зекитез
источник
3
((InputMethodManager)getActivity().getSystemService("input_method")).hideSoftInputFromWindow(this.edittxt.getWindowToken(), 0);
Sreelal S
источник
с использованием фрагмента ... этот код работает, чтобы скрыть клавиатуру ... когда фрагмент открыт, избегайте фокуса на поле редактирования текста клавиатуры ...
Sreelal S
2

Я нашел это простое решение, которое сработало для меня. Установите эти атрибуты в родительском макете:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainLayout"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true" >

И теперь, когда действие начинается, этот основной макет по умолчанию получает фокус.

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

findViewById(R.id.mainLayout).requestFocus();

Надеюсь, это сработает для вас.

Салман Назир
источник
1

это решение, которое я использую, это не лучшее решение, но оно хорошо работает для меня

 editComment.setFocusableInTouchMode(false);
 editComment.setOnTouchListener(new OnTouchListener(){

                @Override
                public boolean onTouch(View v, MotionEvent event)
                {
                    // TODO Auto-generated method stub
                    editComment.setFocusableInTouchMode(true);
                     editComment.requestFocus() ;
                    return false;
                }});
Пол Рузенс
источник
1

Интересно, что в этой документации https://developer.android.com/training/keyboard-input/visibility.html указано, что при запуске действия и фокусе на текстовом поле мягкая клавиатура не отображается (а затем переходит к покажу вам, как показать клавиатуру, если вы хотите, с некоторым кодом).

На моем Samsung Galaxy S5 именно так работает мое приложение (без записи в манифесте или определенного кода) - без программной клавиатуры. Однако на Lollipop AVD отображается мягкая клавиатура, что противоречит приведенному выше документу.

Если вы наблюдаете такое поведение при тестировании в AVD, возможно, вы захотите протестировать на реальном устройстве, чтобы увидеть, что произойдет.

Стив Уоринг
источник
1

На это есть несколько хороших ответов в следующем посте: Остановить EditText от получения фокуса при запуске Activity . Я регулярно использую следующий код от Моргана :

<!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
<LinearLayout
    android:focusable="true" 
    android:focusableInTouchMode="true"
    android:layout_width="0px" 
    android:layout_height="0px"/>

<!-- :nextFocusUp and :nextFocusLeft have been set to the id of this component
to prevent the dummy from receiving focus again -->
<AutoCompleteTextView android:id="@+id/autotext"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:nextFocusUp="@id/autotext"     
    android:nextFocusLeft="@id/autotext"/>

ПРИМЕЧАНИЕ: фиктивный элемент должен быть РАЗМЕЩЕН СПРАВА ПЕРЕД фокусируемым элементом.

И я думаю, что он должен отлично работать даже с ScrollView, и для этого не было проблем с доступностью.

Кошик Н.П.
источник
0

Это происходит, когда ваш EditText автоматически получает Focus, когда начинается ваша деятельность. Итак, один простой и стабильный способ исправить это - просто установить начальный фокус на любое другое представление, например кнопку и т. Д.

Вы можете сделать это в XML макета, код не требуется.

Mtl Dev
источник
0

Принятый ответ у меня не работает, поэтому дайте ответное решение, может быть полезно!

EditText edt = (EditText) findViewById(R.id.edt);
edt.requestFocus();    
edt.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
edt.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));

Теперь клавиатура открыта, наслаждайтесь :)

Йогеш Рати
источник
Вопрос заключался в том , чтобы предотвратить клавиатуру от открытия.
jk7
0

android: windowSoftInputMode = "stateHidden | adjustResize"

Работает нормально

Софтлабсиндия
источник
0

Добавьте приведенный ниже код в верхнюю часть XML-файла активности и убедитесь, что представление находится над EditText.

<View 
android:layout_width="0dp"
android:layout_height="0dp"
android:focusableInTouchMode="true"/>
Аабаузер
источник
0

android:focusableInTouchMode="true"

Добавьте указанную выше строку в xml EditTextили, TextInputLayoutкоторая имеет фокус и вызываетsoftInputKeyboard всплывающее окно.

Это решило проблему для нас, и теперь клавиатура не всплывает.

Шераз Ахмад Хилджи
источник
0

search_edit_text = (EditText) findViewById (R.id.search_edit_text);

    search_edit_text.requestFocus();
    search_edit_text.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
    search_edit_text.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));

Это работает для меня, ребята, фрагмент может иметь другой синтаксис. ЭТО РАБОТАЕТ НА ДЕЯТЕЛЬНОСТЬ

Маюреш Пачангане
источник
В своем ответе вы должны указать любые ограничения, предположения или упрощения. См. Дополнительные сведения о том, как ответить по этой ссылке: stackoverflow.com/help/how-to-answer
Усама Абдулрехман
-1

Если в вашем представлении есть EditText и Listview, то клавиатура откроется по умолчанию. Чтобы скрыть клавиатуру от всплывающего окна по умолчанию, выполните следующие действия.

this.listView.requestFocus();

Убедитесь, что вы запрашиваете фокус на представлении списка после получения представления для editText.

Например,

this.listView = (ListView) this.findViewById(R.id.list);
this.editTextSearch = (EditText) this.findViewById(R.id.editTextSearch);
this.listView.requestFocus();

Если вы это сделаете, то editText получит фокус и появится клавиатура.

Притеш Шах
источник
Я сделал это, но клавиатура все еще выскакивает, а в центре внимания находится editText.
Дэвид Дориа,