開發過程中碰到測試提出要求,當進入有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繪制完成之后才產生作用,建議設置一個延時。