У мене з’явилося відносно просте запитання. У мене є діяльність з великою кількістю 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 " М'яка клавіатура завжди прихована, коли головне вікно діяльності має фокус на вході.
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 an 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 від уваги при запуску діяльності . Я регулярно використовую наступний код Моргана :
<!-- 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 | prilagodResize"
Працює чудово
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();
Якщо ви це зробите, то редагуванняText отримає фокус, і клавіатура з'явиться.