Не работает целевой запрос EditText.
У меня есть EditText
и Button
. При нажатии кнопки я хочу открыть клавиатуру EditText
и в то же время запросить фокус на EditText
, чтобы пользователь сразу начал вводить текст и текст в EditText
. Но в моем случае, когда я нажимаю кнопку, он открывает клавиатуру, но не будет фокусироваться на EditText
, из-за чего пользователю нужно снова щелкнуть EditText
чтобы написать на нем. В чем проблема. Любая помощь или предложение.
Код При нажатии кнопки
m_SearchEditText.requestFocus();
InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInputFromWindow(m_SearchEditText.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);
Ответы
Ответ 1
убедитесь, что edittext настраивается в сенсорном режиме. Вы можете сделать это двумя способами.
В xml:
android:focusableInTouchMode="true"
в Java:
view.setFocusableInTouchMode(true);
Лично я не верю определению XML этого параметра. Я всегда запрашиваю фокус с помощью этих двух строк кода:
view.setFocusableInTouchMode(true);
view.requestFocus();
Клавиатура shoul появляется сама по себе без необходимости вызова InputMethodManager.
Он работает в большинстве случаев. Как только это не сработало для меня, потому что я потерял ссылку на объект из-за довольно большой обработки - убедитесь, что это не ваша проблема.
Ответ 2
В моем случае это сработало, добавив обработчик после того, как вы нажали на кнопку, и фокус, установленный в другом виде, фокус может вернуться к вашему нужному представлению.
просто поместите это в свой код:
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
lastview.getEditText().clearFocus();
m_SearchEditText.requestFocus();
InputMethodManager mgr = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(mLastNameET, InputMethodManager.SHOW_IMPLICIT);
}
}, 100);
Я надеюсь, что это было полезно
Ответ 3
В вашем manifest.xml напишите:
<activity android:name=".MainActivity"
android:label="@string/app_name"
android:windowSoftInputMode="stateAlwaysVisible" />
И вызовите m_SearchEditText.requestfocus()
в oncreate()
.
ИЛИ,
Пытаться:
if(m_SearchEditText.requestFocus()) {
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
Ответ 4
Следующие работы для меня и должны помочь:
EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);
Ответ 5
В качестве дополнения к этому ответу (я не добавил его в качестве комментария из-за репутации...).
Если вы хотите уменьшить время задержки до нуля, вместо этого используйте handler.post(). Полный код:
final Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
lastview.getEditText().clearFocus();
m_SearchEditText.requestFocus();
InputMethodManager mgr = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(mLastNameET, InputMethodManager.SHOW_IMPLICIT);
}
});
Ответ 6
Для этого нужно два атрибута xml:
android:focusable="true"
android:focusableInTouchMode="true"
Добавьте их в EditText, а также в родительские макеты (любой макет, внутри которого находятся эти представления). По умолчанию они являются ложными, поэтому фокус не предоставляется запрашиваемому представлению.
Источник: https://developer.android.com/reference/android/view/View.html#attr_android:focusable
После того как u покажет EditText на основе выбора флажка, добавьте следующую и предыдущую точки фокусировки динамически в код.
Надеюсь это поможет.
Ответ 7
Минималистская версия расширения Kotlin, потому что мы должны притворяться, что такого рода тупые вызовы в системные службы не нужны:
fun EditText.requestKeyboardFocus() {
val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}
Ответ 8
После ответа Салех Серешки и комментария Пауминку я использую:
m_SearchEditText.post(new Runnable() {
@Override
public void run() {
m_SearchEditText.requestFocus();
}
});
который в Kotlin эквивалентен:
m_SearchEditText.post { m_SearchEditText.requestFocus() }