問題:Edittext元件會在界面生成是自動擷取焦點,進而軟鍵盤也會自動被調出,
并且點選其他按鈕(或空白地方)時,軟鍵盤也不會消失,怎麼解決這一現象?
1.解決:在界面生成是自動失去焦點
網友的其他解決方法:
讓EditText所在的layout(布局)獲得焦點,給layout注冊OnTouchListener監聽器
直接使用 .requestFocus() 無法擷取焦點,焦點依然在EditTtext上
先調用下面這兩個方法:
.setFocusable(true);
.setFocusableInTouchMode(true);
再調用 .requestFocus() 就可擷取焦點。
relative.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
relative.setFocusable(true);
relative.setFocusableInTouchMode(true);
relative.requestFocus();
return false;
}
});
2解決:解決失去焦點隐藏軟鍵盤
如果是Activity,直接重寫onTouchEvent方法。代碼如下:
EditText et_username=(EditText)findViewById(R.id.et_username);
EditText et_password=(EditText)findViewById(R.id.et_password);
1 @Override
2 public boolean onTouchEvent(MotionEvent event) {
3 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
4 imm.hideSoftInputFromWindow(et_username.getWindowToken(), 0);
5 imm.hideSoftInputFromWindow(et_password.getWindowToken(), 0);
6 return super.onTouchEvent(event);
7
如果是fragment,給fragment最外圍布局設定了setOnTouchListener監聽,達到了預期的效果,代碼如下:
EditText et_username=(EditText)findViewById(R.id.et_username);
EditText et_password=(EditText)findViewById(R.id.et_password);
@Override
public boolean onTouch(View v, MotionEvent event) {
InputMethodManager imm = (InputMethodManager) getActivity()
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(et_username.getWindowToken(), 0);
imm.hideSoftInputFromWindow(et_password.getWindowToken(), 0);
return true;
}
檢視了一下這個接口和這個方法,文檔中對該方法的傳回值描述如下:True if the listener has consumed the event, false otherwise。大概意思就是說,如果傳回true,則表示監聽器消耗了該事件(我的了解就是不用繼續向上傳遞該事件了,該事件的傳遞到此為止);否則傳回false。首先觸發到的監聽是最底層最直接給它設定的監聽,如果是false,并且它的父控件如果也注冊次監聽,那麼它的父控件也會監聽也會被觸發 ;如果是true,則不會觸發父控件的監聽。
如果是fragment,給fragment最外圍布局設定了setOnTouchListener監聽,達到了預期的效果,代碼如下:
EditText et_username=(EditText)findViewById(R.id.et_username);
EditText et_password=(EditText)findViewById(R.id.et_password);
@Override
public boolean onTouch(View v, MotionEvent event) {
InputMethodManager imm = (InputMethodManager) getActivity()
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(et_username.getWindowToken(), 0);
imm.hideSoftInputFromWindow(et_password.getWindowToken(), 0);
return true;
}