Android: показывать программную клавиатуру автоматически, когда фокус находится на EditText - PullRequest
318 голосов
/ 08 марта 2010

Я показываю поле ввода, используя AlertDialog. EditText внутри самого диалога автоматически фокусируется, когда я вызываю AlertDialog.show(), но программная клавиатура не отображается автоматически.

Как сделать так, чтобы программная клавиатура автоматически отображалась при отображении диалогового окна? (и нет физической / аппаратной клавиатуры). Аналогично тому, как когда я нажимаю кнопку «Поиск», чтобы вызвать глобальный поиск, автоматически отображается программная клавиатура.

Ответы [ 25 ]

6 голосов
/ 21 июня 2012

Да, вы можете сделать с setOnFocusChangeListener, это поможет вам.

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }
});
3 голосов
/ 09 июня 2012

Если кто-то получает:

Невозможно сделать статическую ссылку на нестатический метод getSystemService (String) из типа Activity

Попробуйте добавить context к вызову getSystemService.

So

InputMethodManager imm = 
(InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
1 голос
/ 25 октября 2011

Исходный вопрос касается диалогов, и мой EditText находится в обычном режиме. Во всяком случае, я подозреваю, что это должно работать для большинства из вас тоже. Так вот что работает для меня (выше предложенный метод с самым высоким рейтингом ничего не сделал для меня). Вот специальный EditView, который делает это (подклассы не нужны, но я нашел это удобным для моих целей, так как я хотел также захватить фокус, когда представление становится видимым).

На самом деле это во многом совпадает с ответом тидбека. Я на самом деле не заметил его ответа, так как у него были нулевые голоса. Тогда я собирался просто прокомментировать его пост, но это было бы слишком долго, поэтому я все равно закончил делать этот пост. Тидбек указывает, что он не уверен, как это работает с устройствами, имеющими клавиатуры. Я могу подтвердить, что поведение кажется одинаковым в любом случае. Это так, что в портретном режиме программная клавиатура выскакивает, а в альбомной - нет. Сдвинуть или нет физическую клавиатуру на моем телефоне не имеет значения.

Потому что лично я нашел поведение немного неловким, которое я выбрал: InputMethodManager.SHOW_FORCED. Это работает так, как я хотел, чтобы это работало. Клавиатура становится видимой независимо от ориентации, однако, по крайней мере, на моем устройстве она не выскакивает, если выдвинута аппаратная клавиатура.

import android.app.Service;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;

public class BringOutTheSoftInputOnFocusEditTextView extends EditText {

    protected InputMethodManager inputMethodManager;

    public BringOutTheSoftInputOnFocusEditTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public BringOutTheSoftInputOnFocusEditTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public BringOutTheSoftInputOnFocusEditTextView(Context context) {
        super(context);
        init();
    }

    private void init() {
        this.inputMethodManager = (InputMethodManager)getContext().getSystemService(Service.INPUT_METHOD_SERVICE);
        this.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus) {
                    BringOutTheSoftInputOnFocusEditTextView.this.inputMethodManager.showSoftInput(BringOutTheSoftInputOnFocusEditTextView.this, InputMethodManager.SHOW_FORCED);
                }
            }
        });
    }

    @Override
    protected void onVisibilityChanged(View changedView, int visibility) {
        super.onVisibilityChanged(changedView, visibility);
        if (visibility == View.VISIBLE) {
            BringOutTheSoftInputOnFocusEditTextView.this.requestFocus();
        }
    }

}
1 голос
/ 24 марта 2015

Чтобы показать клавиатуру, мне пришлось сделать следующее

Android TextField: установить фокус + программный ввод программно

По сути, решение следующее

@Override
public void onResume() {
    super.onResume();
    //passwordInput.requestFocus(); <-- that doesn't work
    passwordInput.postDelayed(new ShowKeyboard(), 325); //250 sometimes doesn't run if returning from LockScreen
}

Где ShowKeyboard равно

private class ShowKeyboard implements Runnable {
    @Override
    public void run() {
        passwordInput.setFocusableInTouchMode(true);
        //passwordInput.requestFocusFromTouch(); //this gives touch event to launcher in background -_-
        passwordInput.requestFocus();
        getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(passwordInput, 0);
    }
}

После успешного ввода я также убеждаюсь, что скрываю клавиатуру

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE))
                    .hideSoftInputFromWindow(getView().getWindowToken(), 0);
1 голос
/ 19 февраля 2015

попробуйте и используйте:

editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
1 голос
/ 02 декабря 2014

Кажется, проблема в том, что поскольку место, где вы вводите текст, изначально скрыто (или вложено, или что-то в этом роде), AlertDialog автоматически устанавливает флаг WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM или WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, чтобы вещи не вызывали мягкий ввод показать вверх.

Чтобы исправить это, добавьте следующее:

(...)
// Create the dialog and show it
Dialog dialog = builder.create()
dialog.show();

// After show (this is important specially if you have a list, a pager or other view that uses a adapter), clear the flags and set the soft input mode
dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
1 голос
/ 08 октября 2018

Я создал хорошие функции расширения kotlin-esqe, если кому-то это интересно

fun Activity.hideKeyBoard() {
    val view = this.currentFocus
    val methodManager = this.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.hideSoftInputFromWindow(view!!.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
}

fun Activity.showKeyboard() {
    val view = this.currentFocus
    val methodManager = this.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}
0 голосов
/ 12 сентября 2018
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

Я вызываю это в onCreate (), чтобы автоматически показывать клавиатуру при входе в Activity.

0 голосов
/ 30 августа 2018

Попробуйте это

SomeUtils.java

public static void showKeyboard(Activity activity, boolean show) {
    InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);

    if(show)
        inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
    else
        inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY,0);
}
0 голосов
/ 26 февраля 2015

Это немного сложно. Я так и сделал, и это сработало.

1.При первом вызове скрыть программный ввод из окна. Это позволит скрыть программный ввод, если программная клавиатура видна, или ничего не делать, если ее нет.

2. Покажите ваш диалог

3. Затем просто позвоните, чтобы переключить программный ввод.

код:

InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
//hiding soft input
inputManager.hideSoftInputFromWindow(findViewById(android.R.id.content).getWind‌​owToken(), 0);
//show dialog
yourDialog.show();
//toggle soft input
inputManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.SHOW_IMPLICIT);
...