Android一行代碼實現:點擊屏幕其他位置隱藏鍵盤

有時候會遇到一個需求,點擊屏幕其他位置,把已經打開的鍵盤隱藏掉。比如登錄, 注冊之類的常見頁面.

在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;

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
禁止轉載,如需轉載請通過簡信或評論聯系作者。

推薦閱讀更多精彩內容