有時候會遇到一個需求,點擊屏幕其他位置,把已經打開的鍵盤隱藏掉。比如登錄, 注冊之類的常見頁面.
在onclick 中隱藏是可以實現的,但是在頁面非常的復雜 onclick 方法很多時,就會有邏輯處理沖突的情況。
下面直接上代碼:
//打開或關閉軟鍵盤
public classKeyBoardUtils {
/**
* 打開軟鍵盤
*
*@parammEditText
*@parammContext
*/
public static voidopenKeybord(EditText mEditText, Context mContext) {
InputMethodManager imm = (InputMethodManager) mContext
.getSystemService(INPUT_METHOD_SERVICE);
imm.showSoftInput(mEditText, InputMethodManager.RESULT_SHOWN);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,
InputMethodManager.HIDE_IMPLICIT_ONLY);
}
/**
* 關閉軟鍵盤
*
*@parammEditText
*@parammContext
*/
public static voidcloseKeybord(EditText mEditText, Context mContext) {
InputMethodManager imm = (InputMethodManager) mContext.getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mEditText.getWindowToken(),0);
}
/**
* des:隱藏軟鍵盤,這種方式參數為activity
*
*@paramactivity
*/
public static voidhideInputForce(Activity activity) {
if(activity ==null|| activity.getCurrentFocus() ==null)
return;
((InputMethodManager) activity.getSystemService(INPUT_METHOD_SERVICE))
.hideSoftInputFromWindow(activity.getCurrentFocus()
.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
/**
* 打開鍵盤
**/
public static voidshowInput(Context context, View view) {
InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
if(imm !=null) {
view.requestFocus();
imm.showSoftInput(view,0);
}
}
}
BaseActivity
public class BaseActivity extends AppCompatActivity {
//region軟鍵盤的處理
/**
* 清除editText的焦點
*
*@paramv焦點所在View
*@paramids輸入框
*/
public void clearViewFocus(View v,int... ids) {
if(null!= v &&null!= ids && ids.length>0) {
for(intid : ids) {
if(v.getId() == id) {
v.clearFocus();
break;
}
}
}
}
/**
* 隱藏鍵盤
*
*@paramv焦點所在View
*@paramids輸入框
*@returntrue代表焦點在edit上
*/
public boolean isFocusEditText(View v,int... ids) {
if(vinstanceofEditText) {
EditText tmp_et = (EditText) v;
for(intid : ids) {
if(tmp_et.getId() == id) {
return true;
}
}
}
return false;
}
//是否觸摸在指定view上面,對某個控件過濾
public boolean isTouchView(View[] views, MotionEvent ev) {
if(views ==null|| views.length==0)return false;
int[] location =new int[2];
for(View view : views) {
view.getLocationOnScreen(location);
intx = location[0];
inty = location[1];
if(ev.getX() > x && ev.getX() < (x + view.getWidth())
&& ev.getY() > y && ev.getY() < (y + view.getHeight())) {
return true;
}
}
return false;
}
//endregion
//region 右滑返回上級
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if(ev.getAction() == MotionEvent.ACTION_DOWN) {
if(isTouchView(filterViewByIds(), ev))return super.dispatchTouchEvent(ev);
if(hideSoftByEditViewIds() ==null|| hideSoftByEditViewIds().length==0)
return super.dispatchTouchEvent(ev);
View v = getCurrentFocus();
if(isFocusEditText(v, hideSoftByEditViewIds())) {
//隱藏鍵盤
KeyBoardUtils.hideInputForce(this);
clearViewFocus(v, hideSoftByEditViewIds());
}
}
return super.dispatchTouchEvent(ev);
}
/**
* 傳入EditText的Id
* 沒有傳入的EditText不做處理
*
*@returnid 數組
*/
public int[] hideSoftByEditViewIds() {
return null;
}
/**
* 傳入要過濾的View
* 過濾之后點擊將不會有隱藏軟鍵盤的操作
*
*@returnid 數組
*/
public View[] filterViewByIds() {
return null;
}
}
我們只要在hideSoftByEditViewIds()方法中直接return int數組即可,int值為editText的id,然后就完成了.
@Override
public int[] hideSoftByEditViewIds() {
int[] ids = {R.id.et_phone, R.id.et_check_code, R.id.et_city_code};
return ids;
}
設置點擊不需要隱藏的View
@Override
public View[] filterViewByIds() {
View[] views = {xxxx,xxxxx};
return views;
}