Не работает целевой запрос 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() }