У меня относительно простой вопрос. У меня есть активность, в которой много EditText. Когда я открываю действие, оно автоматически фокусируется на первом EditText и отображает виртуальную клавиатуру.
Как я могу предотвратить это?
У меня относительно простой вопрос. У меня есть активность, в которой много EditText. Когда я открываю действие, оно автоматически фокусируется на первом EditText и отображает виртуальную клавиатуру.
Как я могу предотвратить это?
Ответы:
Используйте эти атрибуты в теге макета в файле XML:
android:focusable="true"
android:focusableInTouchMode="true"
Как сообщили другие участники в комментариях, он не работает, ScrollView
поэтому вам необходимо добавить эти атрибуты к основному дочернему элементу ScrollView
.
Вы можете добавить это в свою деятельность Android Manifest:
android:windowSoftInputMode="stateHidden|adjustResize"
android:windowSoftInputMode="stateHidden|adjustPan"
У меня есть несколько реализаций описаны здесь, но теперь я уже добавлен в 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, ложь);
Для каждого 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
Вероятно, возможна дополнительная оптимизация кода.
((InputMethodManager)getActivity().getSystemService("input_method")).hideSoftInputFromWindow(this.edittxt.getWindowToken(), 0);
Я нашел это простое решение, которое сработало для меня. Установите эти атрибуты в родительском макете:
<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();
Надеюсь, это сработает для вас.
это решение, которое я использую, это не лучшее решение, но оно хорошо работает для меня
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 именно так работает мое приложение (без записи в манифесте или определенного кода) - без программной клавиатуры. Однако на Lollipop AVD отображается мягкая клавиатура, что противоречит приведенному выше документу.
Если вы наблюдаете такое поведение при тестировании в AVD, возможно, вы захотите протестировать на реальном устройстве, чтобы увидеть, что произойдет.
На это есть несколько хороших ответов в следующем посте: Остановить EditText от получения фокуса при запуске Activity . Я регулярно использую следующий код от Моргана :
<!-- 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 автоматически получает Focus, когда начинается ваша деятельность. Итак, один простой и стабильный способ исправить это - просто установить начальный фокус на любое другое представление, например кнопку и т. Д.
Вы можете сделать это в 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"
Работает нормально
android:focusableInTouchMode="true"
Добавьте указанную выше строку в xml EditText
или, TextInputLayout
которая имеет фокус и вызываетsoftInputKeyboard
всплывающее окно.
Это решило проблему для нас, и теперь клавиатура не всплывает.
search_edit_text = (EditText) findViewById (R.id.search_edit_text);
search_edit_text.requestFocus();
search_edit_text.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
search_edit_text.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));
Это работает для меня, ребята, фрагмент может иметь другой синтаксис. ЭТО РАБОТАЕТ НА ДЕЯТЕЛЬНОСТЬ
Если в вашем представлении есть EditText и Listview, то клавиатура откроется по умолчанию. Чтобы скрыть клавиатуру от всплывающего окна по умолчанию, выполните следующие действия.
this.listView.requestFocus();
Убедитесь, что вы запрашиваете фокус на представлении списка после получения представления для editText.
Например,
this.listView = (ListView) this.findViewById(R.id.list);
this.editTextSearch = (EditText) this.findViewById(R.id.editTextSearch);
this.listView.requestFocus();
Если вы это сделаете, то editText получит фокус и появится клавиатура.