日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

android自动退出对话框,Android开发 在用EditText对话框Dialog退出后实现输入盘的退出...

發(fā)布時間:2023/12/2 Android 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android自动退出对话框,Android开发 在用EditText对话框Dialog退出后实现输入盘的退出... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

在使用繼承的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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。