原文網址:http://www.2cto.com/kf/201505/401382.html
很多時候,我們在使用應用時,會出現輸入法軟鍵盤彈出的問題,通常情況下,我們默認會使用戶點擊返回鍵或者下一步對軟鍵盤進行隱藏。為了更好的體驗,我們可以實現當用戶使用完畢軟鍵盤時。點擊空白區域即可實現隱藏的功能。效果如圖所示:
代碼實現
代碼塊語法遵循標准markdown代碼,例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
<code
class
=
"language-java"
hljs=
""
>
package
example.com.jinlin.myapplication;
import
android.content.Context;
import
android.os.Bundle;
import
android.os.IBinder;
import
android.support.v7.app.AppCompatActivity;
import
android.view.MotionEvent;
import
android.view.View;
import
android.view.inputmethod.InputMethodManager;
import
android.widget.EditText;
/**
* Created by J!nl!n on 15/5/21.
*/
public
abstract
class
BaseActivity
extends
AppCompatActivity {
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
iniView();
}
public
abstract
void
iniView();
@Override
public
boolean
dispatchTouchEvent(MotionEvent ev) {
if
(ev.getAction() == MotionEvent.ACTION_DOWN) {
View v = getCurrentFocus();
if
(isShouldHideKeyboard(v, ev)) {
hideKeyboard(v.getWindowToken());
}
}
return
super
.dispatchTouchEvent(ev);
}
/**
* 根據EditText所在坐標和用戶點擊的坐標相對比,來判斷是否隱藏鍵盤,因為當用戶點擊EditText時則不能隱藏
*
* @param v
* @param event
* @return
*/
private
boolean
isShouldHideKeyboard(View v, MotionEvent event) {
if
(v !=
null
&& (v
instanceof
EditText)) {
int
[] l = {
0
,
0
};
v.getLocationInWindow(l);
int
left = l[
0
],
top = l[
1
],
bottom = top + v.getHeight(),
right = left + v.getWidth();
if
(event.getX() > left && event.getX() < right
&& event.getY() > top && event.getY() < bottom) {
// 點擊EditText的事件,忽略它。
return
false
;
}
else
{
return
true
;
}
}
// 如果焦點不是EditText則忽略,這個發生在視圖剛繪制完,第一個焦點不在EditText上,和用戶用軌跡球選擇其他的焦點
return
false
;
}
/**
* 獲取InputMethodManager,隱藏軟鍵盤
* @param token
*/
private
void
hideKeyboard(IBinder token) {
if
(token !=
null
) {
InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
im.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS);
}
}
}
</code>
|
當然我們還有更加簡單的方法來實現該功能,只需要重寫onTouchEvent方法即可。代碼如下:
1
2
3
4
5
6
7
8
9
10
11
|
// 點擊空白區域 自動隱藏軟鍵盤
public
boolean
onTouchEvent(MotionEvent event) {
if
(
null
!=
this
.getCurrentFocus()){
/**
* 點擊空白位置 隱藏軟鍵盤
*/
InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
return
mInputMethodManager.hideSoftInputFromWindow(
this
.getCurrentFocus().getWindowToken(),
0
);
}
return
super
.onTouchEvent(event);
}
|
使用一個BaseActivity進行一些處理公共操作,其他Activity均繼承自該基類Activity即可,則所有界面均可實現點擊空白區域,隱藏軟鍵盤。
android 點擊關閉軟鍵盤
原文網址:http://www.2cto.com/kf/201412/360428.html
在項目中,editText獲取焦點后,會自動彈出軟鍵盤,關閉的時候一般需要按返回鍵或者點擊軟鍵盤上的按鈕,
即使當前activity已經finish掉,軟鍵盤依然存在,會影響用戶的體驗。
網上目前有很多很詳細的辦法,比如點擊其他空白區域,軟鍵盤就會消失之類的方法,我們項目中沒有要求這個,要求的是只要
不遮擋其他操作,還有當前Activity關閉掉后軟鍵盤消失就行,
今天給大家分享兩個辦法:
1
2
3
4
5
6
7
8
9
10
11
|
//此方法,如果顯示則隱藏,如果隱藏則顯示
private
void
hintKbOne() {
InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
// 得到InputMethodManager的實例
if
(imm.isActive()) {
// 如果開啟
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT,
InputMethodManager.HIDE_NOT_ALWAYS);
}
}
|
1
2
3
4
5
6
7
8
9
|
//此方法只是關閉軟鍵盤
private
void
hintKbTwo() {
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
if
(imm.isActive()&&getCurrentFocus()!=
null
){
if
(getCurrentFocus().getWindowToken()!=
null
) {
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
}
|
當需要點擊事件關閉軟鍵盤的時候只需要調用方法就好。