Android TextField:以编程方式设置焦点+软输入

Android TextField : set focus + soft input programmatically

在我看来,我有一个搜索EditText,我想以编程方式触发字段上单击事件的行为,即将焦点放在文本字段上并在必要时显示软键盘(如果没有可用的硬键盘)。

我试过field.requestFocus()。 该字段实际上获得焦点但不显示软键盘。

我试过field.performClick()。 但那只调用该字段的OnClickListener。

任何的想法 ?


好先生,试试这个:

1
2
edittext.setFocusableInTouchMode(true);
edittext.requestFocus();

我不确定,但某些手机(某些旧设备)可能需要这样做:

1
2
3
final InputMethodManager inputMethodManager = (InputMethodManager) context
                .getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.showSoftInput(edittext, InputMethodManager.SHOW_IMPLICIT);


这是适合我的代码。

1
2
3
4
5
6
7
edittext.post(new Runnable() {
    public void run() {
        edittext.requestFocusFromTouch();
        InputMethodManager lManager = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
        lManager.showSoftInput(edittext, 0);
    }
});

而已!请享用 ;)


在其他两个答案对我不起作用后,以下代码对我有用:

1
2
3
4
5
6
7
@Override
public void onResume() {
    super.onResume();
    SingletonBus.INSTANCE.getBus().register(this);
    //passwordInput.requestFocus(); <-- that doesn't work
    passwordInput.postDelayed(new ShowKeyboard(), 300); //250 sometimes doesn't run if returning from LockScreen
}

其中ShowKeyboard

1
2
3
4
5
6
7
8
9
10
private class ShowKeyboard implements Runnable {
    @Override
    public void run() {
        passwordInput.setFocusableInTouchMode(true);
  //      passwordInput.requestFocusFromTouch();
        passwordInput.requestFocus();            
        getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(passwordInput, 0);
    }
}

输入成功后,我也确保隐藏键盘

1
2
3
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE))
                    .hideSoftInputFromWindow(getView().getWindowToken(), 0);

从技术上讲,我只是在运行软键盘显示请求之前添加了300毫秒的延迟。很奇怪,对吗?还将requestFocus()更改为requestFocusFromTouch()

编辑:不要使用requestFocusFromTouch()它给发射器发出触摸事件。坚持requestFocus()

EDIT2:在对话框(DialogFragment)中,使用以下内容

1
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

代替

1
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);


在我的情况下,我想显示虚拟键盘而没有引用特定的文本框,所以我使用了接受的答案的第一部分来集中注意力:

1
2
edittext.setFocusableInTouchMode(true);
edittext.requestFocus();

然后我展示了虚拟键盘:

1
2
InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

1
2
3
4
5
6
7
        field.post(new Runnable() {
            @Override
            public void run() {
                field.requestFocus();
                field.onKeyUp(KeyEvent.KEYCODE_DPAD_CENTER, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_CENTER));
            }
        });