Как отобразить софт-клавиатуру, когда текст редактирования сфокусирован - PullRequest
409 голосов
/ 24 февраля 2011

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

  1. Когда отображается мой Activity, мой EditText находится в фокусе, но клавиатура не отображается, мне нужно снова нажать на нее, чтобы отобразить клавиатуру (она должна отображаться при отображении моего Activity ).

  2. И когда я нажимаю «Готово» на клавиатуре, клавиатура сбрасывается, но EditText остается в фокусе, а у вас нет желания (потому что мое редактирование завершено).

Чтобы возобновить, моя проблема в том, чтобы на iPhone было что-то похожее: синхронизировать клавиатуру с моим состоянием EditText (сфокусировано / не сфокусировано) и, конечно же, нет программной клавиатуры, если есть физическая один.

Ответы [ 35 ]

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

Это дикий, но на самом деле работает

fun showKeyboard(view: View) {
    try {
        InputMethodManager::class.java.getMethod(
                "showSoftInputUnchecked",
                Int::class.javaPrimitiveType,
                ResultReceiver::class.java
        ).apply {
            isAccessible = true
            invoke(view.context.inputMethodManager, 0, null)
        }
    }
    catch (e: Exception) {
       e.printStackTrace()
    }
}
0 голосов
/ 27 декабря 2017

вызов метода requestFocus () для editText в методе Activity () onCrete () и вызов метода clearFocus () для того же editText при нажатии, выполненном на клавиатуре.

0 голосов
/ 03 августа 2017

Вы также можете создать собственное расширение EditText, которое знает, как открывать программную клавиатуру, когда она получает фокус.Это то, что я в итоге сделал.Вот что сработало для меня:

public class WellBehavedEditText extends EditText {
    private InputMethodManager inputMethodManager;
    private boolean showKeyboard = false;

    public WellBehavedEditText(Context context) {
        super(context);
        this.initializeWellBehavedEditText(context);
    }

    public WellBehavedEditText(Context context, AttributeSet attributes) {
        super(context, attributes);
        this.initializeWellBehavedEditText(context);
    }

    public WellBehavedEditText(Context context, AttributeSet attributes, int defStyleAttr) {
        super(context, attributes, defStyleAttr);
        this.initializeWellBehavedEditText(context);
    }

    public WellBehavedEditText(Context context, AttributeSet attributes, int defStyleAttr, int defStyleRes) {
        super(context, attributes, defStyleAttr, defStyleRes);
        this.initializeWellBehavedEditText(context);
    }

    private void initializeWellBehavedEditText(Context context) {
        this.inputMethodManager = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);

        final WellBehavedEditText editText = this;
        this.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                if(showKeyboard) {
                    showKeyboard = !(inputMethodManager.showSoftInput(editText, InputMethodManager.SHOW_FORCED));
                }
            }
        });
    }

    @Override
    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
        if(!focused) this.showKeyboard = false;
        super.onFocusChanged(focused, direction, previouslyFocusedRect);
    }

    @Override
    public boolean requestFocus(int direction, Rect previouslyFocusedRect) {
        boolean result = super.requestFocus(direction, previouslyFocusedRect);
        this.showKeyboard = true;
        final WellBehavedEditText self = this;
        this.post(new Runnable() {
            @Override
            public void run() {
                showKeyboard = !(inputMethodManager.showSoftInput(self, InputMethodManager.SHOW_FORCED));
            }
        });
        return result;
    }
}
0 голосов
/ 14 июля 2017
 void requestFocus(View editText, Activity activity)
{
    try {
        editText.requestFocus();
        InputMethodManager imm = (InputMethodManager) a.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
        activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    } catch (Exception e) {
        e.printStackTrace();
    }

}

добавить эту строку тоже не забудьте

activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
0 голосов
/ 23 июня 2017

Я сделал этот класс помощи. Просто передайте контекст и вид, который вы хотите сфокусировать и показать клавиатуру, а затем скрыть клавиатуру. Надеюсь, это поможет.

public class FocusKeyboardHelper {

private View view;
private Context context;
private InputMethodManager imm;

public FocusKeyboardHelper(Context context, View view){
    this.view = view;
    this.context = context;
    imm = (InputMethodManager) context.getSystemService(context.INPUT_METHOD_SERVICE);
}

public void focusAndShowKeyboard(){

    view.requestFocus();
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);

}

public void hideKeyBoard(){
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

}

...