Android TextField : set focus + soft input programmatically
在我看来,我有一个搜索EditText,我想以编程方式触发字段上单击事件的行为,即将焦点放在文本字段上并在必要时显示软键盘(如果没有可用的硬键盘)。
我试过
我试过
任何的想法 ?
好先生,试试这个:
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 } |
其中
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毫秒的延迟。很奇怪,对吗?还将
编辑:不要使用
EDIT2:在对话框(
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)); } }); |