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



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



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

612   16  

16 ответов:

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

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

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

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

android:windowSoftInputMode="stateHidden|adjustResize"

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

android:windowSoftInputMode="stateAlwaysHidden"

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

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

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

ListView.requestFocus(); 

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

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

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

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

@Override
public void onCreate(Bundle savedInstanceState) {

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

}

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

существует, вероятно, больше оптимизации кода возможно.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

android: windowSoftInputMode= "stateHidden / adjustResize"

работает отлично

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

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 получит фокус и клавиатура появится.

Comments

    Ничего не найдено.