在我看来,我有一个搜索EditText,我想以编程方式触发字段上的click事件的行为,即将焦点放在文本字段上并在必要时显示软键盘(如果没有可用的硬键盘)。
我试过了field.requestFocus()
。该字段实际上获得焦点但不显示软键盘。
我试过了field.performClick()
。但是只调用该字段的OnClickListener。
有什么想法吗?
答案 0 :(得分:138)
好先生,试试这个:
edittext.setFocusableInTouchMode(true);
edittext.requestFocus();
我不确定,但某些手机(部分旧设备)可能需要这样做:
final InputMethodManager inputMethodManager = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.showSoftInput(edittext, InputMethodManager.SHOW_IMPLICIT);
答案 1 :(得分:49)
这是适用于我的代码。
edittext.post(new Runnable() {
public void run() {
edittext.requestFocusFromTouch();
InputMethodManager lManager = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
lManager.showSoftInput(edittext, 0);
}
});
就是这样!享受;)
答案 2 :(得分:4)
以下代码 为我工作,在其他两个答案后 对我不起作用:
@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()
。
EDIT2:在对话框(DialogFragment
)中,使用以下
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
而不是
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
答案 3 :(得分:0)
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));
}
});
答案 4 :(得分:0)
在我的情况下,我想显示虚拟键盘而不引用特定的文本框,因此我将接受的答案的第一部分用于 focus :
edittext.setFocusableInTouchMode(true);
edittext.requestFocus();
然后我显示虚拟键盘:
InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
答案 5 :(得分:0)
就我而言,这解决了所有问题:
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()
。当我删除它时,它开始工作:)
答案 6 :(得分:0)
对于kotlin,使用扩展函数实现如下
fun View.showSoftKeyboard() {
this.requestFocus()
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}