Автоматическое выскакивание клавиатуры при запуске активности
У меня есть относительно простой вопрос. У меня есть деятельность с большим количеством EditText в них. Когда я открываю действие, оно автоматически фокусируется на первом EditText и отображает виртуальную клавиатуру.
Как я могу предотвратить это?
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));теперь клавиатура открыта наслаждайтесь :)
Если ваш вид имеет 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