it-roy-ru.com

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

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

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

92
Galip

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

Android:focusable="true"
Android:focusableInTouchMode="true"

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

202
Vikas Patidar

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

Android:windowSoftInputMode="stateHidden|adjustResize"
94
Mobile Bloke

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

Android:windowSoftInputMode="stateAlwaysHidden"

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

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

30
Elenasys

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

ListView.requestFocus(); 

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

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

11
Sid

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
Brent Young

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

@Override
public void onCreate(Bundle savedInstanceState) {

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

}
3
Bobs

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

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

3
Zekitez
((InputMethodManager)getActivity().getSystemService("input_method")).hideSoftInputFromWindow(this.edittxt.getWindowToken(), 0);
3
Sreelal S

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

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

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

2
Salman Nazir

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

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

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

1
Steve Waring

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

1
Kaushik NP

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

 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
Paul Roosens

Android: windowSoftInputMode = "stateHidden | adjustResize"

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

0
Softlabsindia

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

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

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

0
Yogesh Rathi

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

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

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

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

0
Mtl Dev