android自动退出对话框,Android开发 在用EditText对话框Dialog退出后实现输入盘的退出...
前言
在使用繼承的Dialog的方式實現(xiàn)自定義Dialog,如果這個Dialog我們還添加了EditText就會發(fā)現(xiàn)一個問題。在輸入盤顯示后,Dialog退出輸入盤不會退出。網(wǎng)上有一些奇怪的解決辦法,最奇怪的是去根據(jù)Touch事件判斷Touch坐標(biāo)來確定是否點擊了空白在隱藏輸入盤,繞了一個大圈來實現(xiàn),根本就沒仔細(xì)閱讀過Dialog的代碼。其實實現(xiàn)退出Dialog的時候隱藏輸入法很簡單,只要重寫Dialog的dismiss()方法即可,為什么寫這篇博客是因為不想大家被錯誤的實現(xiàn)方式而誤導(dǎo)。所以,這里會啰嗦下問題根結(jié)。
了解Dialog的退出方式
在了解隱藏輸入盤之前,需要排列一下Dialog的退出的3種方式:
1.自定義退出按鍵,點擊后實現(xiàn)dialog.dismiss(); 退出對話框
2.按back鍵,退出對話框
3.點擊Dialog外面的空白背景,退出對話框
錯誤的隱藏輸入盤的方式
@Overridepublic voidonClickLeft(EditDialog dialog) {
dialog.dismiss();
InputMethodManager imm=(InputMethodManager) dialog.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(dialog.getEditContent().getWindowToken(), InputMethodManager.RESULT_UNCHANGED_SHOWN);
}
說說為什么這種方式有問題,其實是因為你調(diào)用了dialog.dismiss(); 后在獲取dialog.getEditContent().getWindowToken() 這個token的時候,必定會返回為null。 因為你的Dialog已經(jīng)退出了。這個EditText已經(jīng)被Window解除關(guān)系。所以我們需要在dimiss方法之前隱藏輸入盤。
容易被誤導(dǎo)難點在哪里?
看了上面的錯誤例子,我們肯定會在隱藏輸入法后在調(diào)用dismiss(); 好像問題已經(jīng)解決了? 并沒有,因為你只解決了第一種情況 ”自定義退出按鍵,點擊后實現(xiàn)dialog.dismiss(); 退出對話框“ ,還有
”按back鍵,退出對話框“
”點擊Dialog外面的空白背景,退出對話框“
這2個情況的調(diào)用是Dialog直接在內(nèi)部封裝調(diào)用了dismiss(); 你無法在獲取在dismiss之前操作隱藏輸入盤。 setOnDismissListener();方法 與 setOnCancelListener();方法 都是執(zhí)行完dismiss();方法后調(diào)用的。這里下面的源碼中看到
按外部空白退出的方式
/*** Called when a touch screen event was not handled by any of the views
* under it. This is most useful to process touch events that happen outside
* of your window bounds, where there is no view to receive it.
*
*@paramevent The touch screen event being processed.
*@returnReturn true if you have consumed the event, false if you haven‘t.
* The default implementation will cancel the dialog when a touch
* happens outside of the window bounds.*/
public booleanonTouchEvent(@NonNull MotionEvent event) {if (mCancelable && mShowing &&mWindow.shouldCloseOnTouch(mContext, event)) {
cancel();return true;
}return false;
}
按返回鍵退出的方式
/*** Called when the dialog has detected the user‘s press of the back
* key. The default implementation simply cancels the dialog (only if
* it is cancelable), but you can override this to do whatever you want.*/
public voidonBackPressed() {if(mCancelable) {
cancel();
}
}
最后都調(diào)用了cancel()方法,而cancel方法最后都調(diào)用了dismiss方法,但是這些回調(diào)都是用Handler發(fā)出去的,所以Dialog都已經(jīng)關(guān)閉(并沒有被銷毀)與window解除了綁定關(guān)系了,才會接收到setOnDismissListener();方法 與 setOnCancelListener(); 這2個回調(diào)。所以在這2個回調(diào)里寫隱藏輸入盤也是錯誤的。
正確的方式
重寫dismiss方法
@Overridepublic voiddismiss() {
InputMethodManager imm=(InputMethodManager) mEditContent.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mEditContent.getWindowToken(), InputMethodManager.RESULT_UNCHANGED_SHOWN);super.dismiss();
}
End
原文:https://www.cnblogs.com/guanxinjing/p/12980640.html
總結(jié)
以上是生活随笔為你收集整理的android自动退出对话框,Android开发 在用EditText对话框Dialog退出后实现输入盘的退出...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通信行程卡怎么记录行程的
- 下一篇: android对话框字体大小,Andro