dialog dismiss時鍵盤不消失的問題淺析及解決辦法
當setCanceledOnTouchOutside(true),點擊陰影處,dialog dismiss時鍵盤不消失的問題。
如圖

一開始覺得很簡單,監(jiān)聽下onDimiss()方法,在里面隱藏鍵盤不就行了。
但是發(fā)現(xiàn)大多數(shù)手機都不會隱藏(魅族x4會隱藏)。
這是為什么呢?為什么鍵盤不消失呢?
經(jīng)過測試,發(fā)現(xiàn)edittext.getWindowToken()為null。
/**
* 關(guān)閉鍵盤
*
* @param context
* @param et
*/
public static void hideKeyboard(Context context, EditText et) {
InputMethodManager imm = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
LogUtils.showLog("hideKeyboard imm.isActive() = "+imm.isActive()+" et.getWindowToken() = "+et.getWindowToken());
if (imm.isActive()) {
imm.hideSoftInputFromWindow(et.getWindowToken(), 0);
}
}

這是因為當ondismiss 方法執(zhí)行的時候,dialog已經(jīng)消失了。已經(jīng)獲取不到windowToken了。
目前發(fā)現(xiàn)有兩種方式覺得這樣的問題
1.在ondismiss()方法里面這樣隱藏軟鍵盤
@Override
public void onDismiss(DialogInterface dialog) {
InputMethodManager inputMgr = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMgr.toggleSoftInput(InputMethodManager.HIDE_NOT_ALWAYS, 0);
}
2.在dismiss之前就隱藏軟鍵盤,因為設(shè)置setCancelOnTouchOutside(true),會響應(yīng)Dialog類的onTouch方法。
public boolean onTouchEvent(MotionEvent event) {
if (mCancelable && mShowing && mWindow.shouldCloseOnTouch(mContext, event)) {
cancel();
return true;
}
return false;
}
/**
* Cancel the dialog. This is essentially the same as calling {@link #dismiss()}, but it will
* also call your {@link DialogInterface.OnCancelListener} (if registered).
*/
public void cancel() {
if (!mCanceled && mCancelMessage != null) {
mCanceled = true;
// Obtain a new message so this dialog can be re-used
Message.obtain(mCancelMessage).sendToTarget();
}
dismiss();
}
重寫下onTouch()方法就可以了。代碼如下
@Override
public boolean onTouchEvent(MotionEvent event) {
if (isShowing() && shouldCloseOnTouch(getContext(),event)){
ViewHelper.hideKeyboard(context, et_reply_comment);
}
return super.onTouchEvent(event);
}
public boolean shouldCloseOnTouch(Context context, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN
&& isOutOfBounds(context, event) && getWindow().peekDecorView() != null) {
return true;
}
return false;
}
private boolean isOutOfBounds(Context context, MotionEvent event) {
final int x = (int) event.getX();
final int y = (int) event.getY();
final int slop = ViewConfiguration.get(context).getScaledWindowTouchSlop();
final View decorView = getWindow().getDecorView();
return (x < -slop) || (y < -slop)
|| (x > (decorView.getWidth()+slop))
|| (y > (decorView.getHeight()+slop));
}
// 關(guān)閉鍵盤
public static void hideKeyboard(Context context, EditText et) {
InputMethodManager imm = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
LogUtils.showLog("hideKeyboard imm.isActive() = "+imm.isActive()+" et.getWindowToken() = "+et.getWindowToken());
if (imm.isActive()) {
imm.hideSoftInputFromWindow(et.getWindowToken(), 0);
}
}
經(jīng)測試,以上兩種方法都可以關(guān)閉軟鍵盤。
另外附在dialog啟動時彈出軟鍵盤代碼,重寫onStart方法
@Override
protected void onStart() {
super.onStart();
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
以上所述是小編給大家介紹的dialog dismiss時鍵盤不消失的問題淺析,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Android 文件存儲與SharedPreferences存儲方式詳解用法
SharedPreferences是安卓平臺上一個輕量級的存儲類,用來保存應(yīng)用的一些常用配置,比如Activity狀態(tài),Activity暫停時,將此activity的狀態(tài)保存到SharedPereferences中;當Activity重載,系統(tǒng)回調(diào)方法onSaveInstanceState時,再從SharedPreferences中將值取出2021-10-10
兩分鐘讓你徹底明白Android Activity生命周期的詳解(圖文介紹)
本篇文章是對Android的生命周期進行了詳細的分析介紹,需要的朋友參考下2013-05-05
android教程viewpager自動循環(huán)和手動循環(huán)
這篇文章主要介紹了android的viewpager自動循環(huán)和手動循環(huán)示例,需要的朋友可以參考下2014-02-02
Android筆記之:在ScrollView中嵌套ListView的方法
本篇文章是對Android中在ScrollView中嵌套ListView的方法進行了詳細的分析介紹,需要的朋友參考下2013-05-05
詳解Kotlin Android開發(fā)中的環(huán)境配置
這篇文章主要介紹了詳解Kotlin Android開發(fā)中的環(huán)境配置的相關(guān)資料,需要的朋友可以參考下2017-06-06

