Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Вы можете добавить это к своей активности в Манифесте Android:

android:windowSoftInputMode="stateHidden|adjustResize"

Ответ 3

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

android:windowSoftInputMode="stateAlwaysHidden"

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

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

Ответ 4

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

ListView.requestFocus(); 

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

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

Ответ 5

fooobar.com/questions/55612/... Это почти правильно:

@Override
public void onCreate(Bundle savedInstanceState) {

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

}

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

Ответ 6

У меня была симулятивная проблема, даже при переключении вкладок клавиатура автоматически открывалась и оставалась на 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, false);

Для каждого 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

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

Ответ 7

Используйте это в своем рабочем коде:

@Override
public void onCreate(Bundle savedInstanceState) {

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

}

Ответ 8

((InputMethodManager)getActivity().getSystemService("input_method")).hideSoftInputFromWindow(this.edittxt.getWindowToken(), 0);

Ответ 9

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

<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();

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

Ответ 10

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

 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;
                }});

Ответ 11

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

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

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

Ответ 12

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

<!-- 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 и не имел никаких проблем с доступностью для этого.

Ответ 13

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

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

Ответ 14

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

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));

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

Ответ 15

андроид: windowSoftInputMode = "stateHidden | adjustResize"

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

Ответ 16

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

<View 
android:layout_width="0dp"
android:layout_height="0dp"
android:focusableInTouchMode="true"/>

Ответ 17

android:focusableInTouchMode="true"

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

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

Ответ 18

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

this.listView.requestFocus();

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

Например,

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

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