У меня вопрос относительно простой. У меня есть активность с большим количеством EditText в них. Когда я открываю действие, он автоматически фокусируется на первом EditText и отображает виртуальную клавиатуру.
Как я могу предотвратить это?
У меня вопрос относительно простой. У меня есть активность с большим количеством EditText в них. Когда я открываю действие, он автоматически фокусируется на первом EditText и отображает виртуальную клавиатуру.
Как я могу предотвратить это?
Используйте эти атрибуты в теге макета в файле 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
.
Я знаю, что на этот вопрос был дан ответ, но просто предоставил альтернативное решение, которое сработало для меня:)
fooobar.com/questions/55612/... Это почти правильно:
@Override
public void onCreate(Bundle savedInstanceState) {
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
Но это должно быть SOFT_INPUT_STATE_HIDDEN, а не 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
Возможно, возможно оптимизация кода.
Используйте это в своем рабочем коде:
@Override
public void onCreate(Bundle savedInstanceState) {
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
((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. Я регулярно использую следующий код 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 и не имел никаких проблем с доступностью для этого.
Это происходит, когда ваш 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));
Теперь клавиатура открыта, наслаждайтесь:)
андроид: windowSoftInputMode = "stateHidden | adjustResize"
Работает нормально
Добавьте приведенный ниже код в начало XML файла активности и убедитесь, что представление находится над EditText.
<View
android:layout_width="0dp"
android:layout_height="0dp"
android:focusableInTouchMode="true"/>
android:focusableInTouchMode="true"
Добавьте указанную выше строку в xml EditText
или TextInputLayout
, которая имеет фокус и вызывает всплывающее окно softInputKeyboard
.
Это решило проблему для нас, и теперь клавиатура не всплывает
Если ваше представление имеет EditText и Listview, то Keyboard откроется по умолчанию. Чтобы скрыть клавиатуру от выскакивания по умолчанию, выполните следующие
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 получит фокус, и клавиатура появится.
Когда Мое приложение запущено (открыто) и если доступно редактирование текста, клавиатура включена (показать).
Как решить эту проблему, нажмите здесь