Android文本字段:以编程方式设置焦点+软输入

cotxawn7  于 2022-11-27  发布在  Android
关注(0)|答案(8)|浏览(162)

在我看来,我有一个搜索EditText,我想通过编程触发该字段上的单击事件的行为,即给予焦点放在文本字段上,并在必要时显示软键盘(如果没有硬键盘可用)。
我试了field.requestFocus()。字段实际上获得了焦点,但软键盘没有显示。
我尝试了field.performClick(),但它只调用了该字段的OnClickListener。
你知道吗?

h22fl7wq

h22fl7wq1#

好先生,试试这个:

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

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

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

vptzau2j2#

下面是适用于我的代码。

edittext.post(new Runnable() {
    public void run() {
        edittext.requestFocusFromTouch();
        InputMethodManager lManager = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
        lManager.showSoftInput(edittext, 0);
    }
});

就是这样!尽情享受吧;)

brjng4g3

brjng4g33#

  • 以下代码对我有效,而 * 其他两个答案对我无效
@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

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);
    }
}

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

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()
编辑2:在对话框(DialogFragment)中,使用以下命令

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

代替

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

nfg76nw04#

在我的例子中,我希望显示虚拟键盘而不引用特定的文本框,所以我使用了focus的公认答案的第一部分:

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

然后我展示了虚拟键盘

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

knsnq2tg5#

对于Kotlin,使用扩展函数实现如下

fun View.showSoftKeyboard() {
    this.requestFocus()
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}
kuhbmx9i

kuhbmx9i6#

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));
            }
        });
f3temu5u

f3temu5u7#

在我的情况只是这解决了所有问题:

val inputMethodManager: InputMethodManager = 
   context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.showSoftInput(edittext, InputMethodManager.SHOW_IMPLICIT)

我把它放在RecyclerView Adapter中,因为我使用数据绑定。我也没有使用edittext.setFocusableInTouchMode(true),因为在我的布局中默认为true。不要使用这行:edittext.requestFocus() .当我把它拆下来的时候,它就开始工作了:)

6uxekuva

6uxekuva8#

瓦尔mBuilder.show

//Coloca o foo no txtDlgQuantidade e então chama o teclado
        mDialogView.txtDlgQuantidade.isFocusable = true
        mDialogView.txtDlgQuantidade.isFocusableInTouchMode = true
        mDialogView.txtDlgQuantidade.requestFocus()
        mAlertDialog.window?.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)
        mAlertDialog.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)

相关问题