Автоматическая всплывающая клавиатура при запуске Activity - PullRequest
95 голосов
/ 12 января 2011

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

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

Ответы [ 17 ]

205 голосов
/ 12 января 2011

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

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

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

95 голосов
/ 04 марта 2012

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

android:windowSoftInputMode="stateHidden|adjustResize"
31 голосов
/ 30 апреля 2014

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

android:windowSoftInputMode="stateAlwaysHidden"

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

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

11 голосов
/ 07 марта 2011

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

ListView.requestFocus(); 

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

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

5 голосов
/ 12 августа 2015

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

3 голосов
/ 24 июля 2012

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

@Override
public void onCreate(Bundle savedInstanceState) {

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

}
3 голосов
/ 14 ноября 2016
((InputMethodManager)getActivity().getSystemService("input_method")).hideSoftInputFromWindow(this.edittxt.getWindowToken(), 0);
3 голосов
/ 09 марта 2012

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

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

2 голосов
/ 19 мая 2016

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

<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 голос
/ 22 января 2013

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

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