【发布时间】:2011-12-26 04:56:01
【问题描述】:
在我看来,我有一个搜索 EditText,我想以编程方式触发该字段上单击事件的行为,即,将焦点放在文本字段上,并在必要时显示软键盘(如果没有可用的硬键盘)。
我试过field.requestFocus()。该字段实际上获得焦点,但未显示软键盘。
我试过field.performClick()。但这只会调用该字段的 OnClickListener。
有什么想法吗?
【问题讨论】:
在我看来,我有一个搜索 EditText,我想以编程方式触发该字段上单击事件的行为,即,将焦点放在文本字段上,并在必要时显示软键盘(如果没有可用的硬键盘)。
我试过field.requestFocus()。该字段实际上获得焦点,但未显示软键盘。
我试过field.performClick()。但这只会调用该字段的 OnClickListener。
有什么想法吗?
【问题讨论】:
好先生,试试这个:
edittext.setFocusableInTouchMode(true);
edittext.requestFocus();
我不确定,但某些手机(某些旧设备)可能需要这样做:
final InputMethodManager inputMethodManager = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.showSoftInput(edittext, InputMethodManager.SHOW_IMPLICIT);
【讨论】:
onResume()方法中调用field.requestFocus()发出的问题(而不是onCreate())。不完全知道它为什么起作用......
onResume 中工作,因为onResume 在onCreate 之后被调用,所以field 在onCreate 运行之前不存在。见这里:developer.android.com/reference/android/app/…
这是对我有用的代码。
edittext.post(new Runnable() {
public void run() {
edittext.requestFocusFromTouch();
InputMethodManager lManager = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
lManager.showSoftInput(edittext, 0);
}
});
就是这样!享受;)
【讨论】:
EditText。
EditText。 Android 设置了一些标志,导致此控件无法接收任何触摸。如果您在可运行文件中添加该字段,则不会设置标志。
EditText 的InputType 被Android 设置为null。如果你设置InputType,它应该可以工作。
以下代码 对我有用,在其他两个答案 对我不起作用之后:
@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);
【讨论】:
requestFocusFromTouch() 似乎触发了启动器上的触摸事件。这很奇怪。
在我的例子中,我想显示虚拟键盘而不引用特定的文本框,所以我使用了 focus 接受答案的第一部分:
edittext.setFocusableInTouchMode(true);
edittext.requestFocus();
然后我显示虚拟键盘:
InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
【讨论】:
对于kotlin,使用扩展函数实现如下
fun View.showSoftKeyboard() {
this.requestFocus()
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}
【讨论】:
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));
}
});
【讨论】:
就我而言,这解决了所有问题:
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()。当我删除它时,它开始工作:)
【讨论】: