天天看點

android 解決EditText無法失去焦點和失去焦點後隐藏軟鍵盤的問題

問題: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;
    }