開發(fā)過程中碰到測試提出要求,當(dāng)進(jìn)入有EditText輸入界面時(shí)在辆,這個(gè)EditText自動(dòng)獲取焦點(diǎn)君躺,并彈出輸入法軟鍵盤。
自個(gè)兒摸索了很久开缎,在網(wǎng)上也搜了很多代碼棕叫,在代碼中設(shè)置setFocusable(true);setFocusableInTouchMode(true);requestFocus();發(fā)現(xiàn)作用不大,在Fragment或者自定義控件中經(jīng)常會(huì)失效奕删。下面介紹兩種可行的方法:
在進(jìn)入界面時(shí)強(qiáng)制彈出俺泣,在onResume方法里面調(diào)用,以下為代碼:
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);
}
然而在該方法過于暴力完残,使用過程中引發(fā)很多問題伏钠,比如按HOME鍵回桌面時(shí)軟鍵盤并不會(huì)消失,需要在onPause中強(qiáng)制隱藏軟鍵盤
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);
}
}
后來經(jīng)同事說起谨设,發(fā)現(xiàn)可以用模擬點(diǎn)擊的方法熟掂,代碼如下:
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繪制完成之后才產(chǎn)生作用扎拣,建議設(shè)置一個(gè)延時(shí)赴肚。