开发过程中碰到测试提出要求,当进入有EditText输入界面时,这个EditText自动获取焦点,并弹出输入法软键盘。
自个儿摸索了很久,在网上也搜了很多代码,在代码中设置setFocusable(true);setFocusableInTouchMode(true);requestFocus();发现作用不大,在Fragment或者自定义控件中经常会失效。下面介绍两种可行的方法:
在进入界面时强制弹出,在onResume方法里面调用,以下为代码:
public static void showKeyBoard(final View v) {
v.requestFocus();
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
InputMethodManager manager = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
manager.showSoftInput(v, InputMethodManager.SHOW_FORCED);
}
}, 100);
}
然而在该方法过于暴力,使用过程中引发很多问题,比如按HOME键回桌面时软键盘并不会消失,需要在onPause中强制隐藏软键盘
public static void hideKeyBoard(final View v) {
InputMethodManager manager = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
if (manager.isActive()) {
manager.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
}
后来经同事说起,发现可以用模拟点击的方法,代码如下:
private void analogClick(View v) {
Log.d(TAG, "-----> analog");
Rect rect = new Rect();
v.getGlobalVisibleRect(rect);
v.requestFocus();
long uptimeMillis = SystemClock.uptimeMillis();
MotionEvent obtain = MotionEvent.obtain(uptimeMillis, uptimeMillis, 0, (float)v.getWidth(), (float) v.getHeight(), 0);
MotionEvent obtain1 = MotionEvent.obtain(uptimeMillis, uptimeMillis, 1, (float)v.getWidth(), (float) v.getHeight(), 0);
editUserName.onTouchEvent(obtain);
editUserName.onTouchEvent(obtain1);
}
注意,使用此方法需要在view绘制完成之后才产生作用,建议设置一个延时。