編輯:關於Android編程
當setCanceledOnTouchOutside(true)
,點擊陰影處,dialog dismiss時鍵盤不消失的問題。
如圖
一開始覺得很簡單,監聽下onDimiss()
方法,在裡面隱藏鍵盤不就行了。
但是發現大多數手機都不會隱藏(魅族x4會隱藏)。
這是為什麼呢?為什麼鍵盤不消失呢?
經過測試,發現edittext.getWindowToken()
為null。
/** * 關閉鍵盤 * * @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 方法執行的時候,dialog已經消失了。已經獲取不到windowToken了。
目前發現有兩種方式覺得這樣的問題
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之前就隱藏軟鍵盤,因為設置setCancelOnTouchOutside(true),會響應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)); } // 關閉鍵盤 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); } }
經測試,以上兩種方法都可以關閉軟鍵盤。
另外附在dialog啟動時彈出軟鍵盤代碼,重寫onStart方法
@Override protected void onStart() { super.onStart(); getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); }
以上所述是小編給大家介紹的dialog dismiss時鍵盤不消失的問題淺析,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對本站網站的支持!
關於android多線程數據讀寫請看博客: android 多線程數據庫讀寫 常常糾結於獲取了SQLiteDatabase每次操作完是否要關閉的問題,每次關閉又怕影
本文將講述android點擊事件的分發過程我的上一篇文章講述了android點擊事件的來源,本文接著講述當點擊事件傳輸到Activity之後 分發的過程是什麼樣的。通過上
Android 調用百度地圖API一、到 百度地圖開發平台下載SDKhttp://lbsyun.baidu.com/index.php?title=android
J2V8是基於Google的JavaScript引擎V8的Java開源項目,實現Java和JavaScript的相互調用。並對Android平台提供支持,最新版本提供了a