在我看来,我有一个EditText搜索,我想以编程方式触发该字段上click事件的行为,即将焦点放在文本字段上,并在必要时显示软键盘(如果没有可用的硬键盘)。
我试过了field.requestFocus()
。该字段实际上获得了焦点,但未显示软键盘。
我试过了field.performClick()
。但这仅调用该字段的OnClickListener。
任何的想法 ?
Answers:
先生,请尝试以下操作:
edittext.setFocusableInTouchMode(true);
edittext.requestFocus();
我不确定,但这在某些手机(某些旧设备)上可能是必需的:
final InputMethodManager inputMethodManager = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.showSoftInput(edittext, InputMethodManager.SHOW_IMPLICIT);
field.requestFocus()
的onResume()
活动(而不是方法onCreate()
)。不完全知道它为什么起作用...
onResume
是因为onResume
after之后被调用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设置了一些标志,这些标志导致此控件不接收任何触摸。如果在可运行对象中添加该字段,则不会设置标志。
InputType
的EditText
是由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 ms的延迟。奇怪吧?也更改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()
似乎在启动器上触发了触摸事件。真奇怪
就我而言,我想显示虚拟键盘,但不引用特定的文本框,因此我使用了已接受答案的第一部分来关注:
edittext.setFocusableInTouchMode(true);
edittext.requestFocus();
然后显示虚拟键盘:
InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);