場景:自定義了一個Dialog,Dialog裡面包含EditText,當輸入時手機鍵盤會彈出,但是點擊空白區域Dialog關閉時鍵盤不會自動隱藏。
之前也自定義過一個Dialog,裡面也是包含EditText,不過因為這個Dialog占地方比較大,當彈出鍵盤時已經沒有空白區域可以點擊,所以在Dialog上添加了一個關閉按鈕,然後調用下面方法:
public static void hideSoftKeyboard(Activity context, View view) {
InputMethodManager imm = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
這樣Dialog關閉後鍵盤都可以自動收起,但是最近做的一個Dialog,當彈出鍵盤後點擊空白區域Dialog關閉了但是鍵盤還是沒有收起!!! 通過不斷的嘗試發現了另外一個方法:
首先我們監聽Dialog的關閉方法,然後調用收起鍵盤的方法。
this.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
// TODO Auto-generated method stub
InputMethodManager inputMgr = (InputMethodManager) context
.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMgr.toggleSoftInput(InputMethodManager.HIDE_NOT_ALWAYS, 0);
}
});
這樣當點擊空白區域關閉Dialog的時候,鍵盤也可以收起了。不過這個方法有個弊端就是如果鍵盤沒有彈出的話就會彈出鍵盤。。。(好坑), 而且判斷鍵盤是否彈出的方法inputMgr.isActive()會一直返回true。。最後沒辦法只能通過重寫父布局,這我是重寫的RelativeLayout,通過onSizeChanged(int w, int h, int oldw, int oldh)和onLayout(boolean changed, int l, int t, int r, int b)方法來判斷鍵盤是否彈出,最後調用上面的方法解決。
這裡再提個自定義Dialog需要注意的問題:當我們給Dialog自定義布局的時候會發現即使我們沒有設置背景,會發現Dialog的背景為白色,一般我們需要的是透明。這裡在自定義的時候需要在代碼裡加入:
Window dialogWindow = getWindow();
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
dialogWindow.setBackgroundDrawableResource(Android.R.color.transparent);
DisplayMetrics d = context.getResources().getDisplayMetrics();
lp.width = (int) (d.widthPixels * 0.6);
dialogWindow.setAttributes(lp);
更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11