點選空白出隱藏鍵盤,或者點選按鈕隱藏軟鍵盤

lixuce1234發表於2017-03-21
很多時候,我們在使用應用時,會出現輸入法軟鍵盤彈出的問題,通常情況下,我們預設會使使用者點選返回鍵或者下一步對軟鍵盤進行隱藏。為了更好的體驗,我們可以實現當使用者使用完畢軟鍵盤時。點選空白區域即可實現隱藏的功能。效果如圖所示:




不多說了看程式碼吧:

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);
        }
    }
}


當然我們還有更加簡單的方法來實現該功能,只需要重寫onTouchEvent方法即可。程式碼如下:

 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即可,則所有介面均可實現點選空白區域,隱藏軟鍵盤。


還有另外一種請款不過情況,在專案中,editText獲取焦點後,會自動彈出軟鍵盤,關閉的時候一般需要按返回鍵或者點選軟鍵盤上的按鈕,

即使當前activity已經finish掉,軟鍵盤依然存在,會影響使用者的體驗。

網上目前有很多很詳細的辦法,比如點選其他空白區域,軟鍵盤就會消失之類的方法,我們專案中沒有要求這個,要求的是隻要

不遮擋其他操作,還有當前Activity關閉掉後軟鍵盤消失就行,

今天給大家分享兩個辦法:

//此方法,如果顯示則隱藏,如果隱藏則顯示
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);
         
    }
}


//此方法只是關閉軟鍵盤
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);
    }             
 }
}




相關文章