AlertDialog中軟鍵盤顯示問題
使用AlertDialog來自定義一個(gè)包含EditText的Dialog,你會(huì)發(fā)現(xiàn)使用的過程中軟鍵盤不會(huì)自動(dòng)顯示出來,這個(gè)問題我覺得跟google對(duì)AlertDialog的定義有關(guān),AlertDialog本身只是一個(gè)警示提示框,不需要編輯,只用來提示客戶,客戶需要做的操作只是取消和確定。
所以這個(gè)問題的本身跟控件的定義有關(guān),雖然網(wǎng)絡(luò)上有各種解決的方法,我的建議還是把AlertDialog改成Dialog,問題自然就解決了。
Dialog中軟件盤隱藏問題
在Dialog中彈出軟件盤后,你會(huì)發(fā)現(xiàn)軟鍵盤的隱藏存在各種問題,你需要自定義一個(gè)Dialog,并在自定義的Dialog中實(shí)現(xiàn)以下代碼
public class MyDialog extends Dialog {
public MyDialog(@NonNull Context context) {
super(context);
}
public MyDialog(@NonNull Context context, int themeResId) {
super(context, themeResId);
}
protected MyDialog(@NonNull Context context, boolean cancelable, @Nullable OnCancelListener cancelListener) {
super(context, cancelable, cancelListener);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
View v = getCurrentFocus();
if (isShouldHideKeyboard(v, ev)) {
hideKeyboard(v.getWindowToken());
}
}
return super.dispatchTouchEvent(ev);
}
/**
* 根據(jù)EditText所在坐標(biāo)和用戶點(diǎn)擊的坐標(biāo)相對(duì)比,來判斷是否隱藏鍵盤,因?yàn)楫?dāng)用戶點(diǎn)擊EditText時(shí)則不能隱藏
*
* @param v
* @param event
* @return
*/
private boolean isShouldHideKeyboard(View v, MotionEvent event) {
if (v != null && (v instanceof EditText)) {
int[] l = {0, 0};
v.getLocationInWindow(l);
int left = l[0],
top = l[1],
bottom = top + v.getHeight(),
right = left + v.getWidth();
if (event.getX() > left && event.getX() < right
&& event.getY() > top && event.getY() < bottom) {
// 點(diǎn)擊EditText的事件,忽略它。
return false;
} else {
return true;
}
}
// 如果焦點(diǎn)不是EditText則忽略,這個(gè)發(fā)生在視圖剛繪制完,第一個(gè)焦點(diǎn)不在EditText上,和用戶用軌跡球選擇其他的焦點(diǎn)
return false;
}
private void hideKeyboard(IBinder token) {
if (token != null) {
InputMethodManager im = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
im.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS);
}
}
}
這時(shí)候你會(huì)發(fā)現(xiàn)問題解決了。。。如果還沒有解決,請(qǐng)?jiān)诹粞愿嬖V我。