点击EditText之外的区域,隐藏软键盘
在父布局与其他控件中加入如下标签
android:clickable="true"
android:focusableInTouchMode="true"
android:focusable="true"
设置OnFocusChange监听,focus改变后隐藏软键盘
mEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
//隐藏软键盘
if (!hasFocus) {
InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
im.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
});
使用EditText时,监听软键盘隐藏
方法1
重写EditText控件
/**
* 拦截键盘向下的 EditTextView
*/
public class ListenKeyboardEditText extends AppCompatEditText {
public ListenKeyboardEditText(Context context) {
super(context);
}
public ListenKeyboardEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ListenKeyboardEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == 1) {
super.onKeyPreIme(keyCode, event);
//隐藏键盘时清除焦点
clearFocus();
if (onKeyBoardHideListener != null) {
onKeyBoardHideListener.onKeyHide(keyCode, event);
}
return false;
}
return super.onKeyPreIme(keyCode, event);
}
/**
* 键盘监听接口
*/
OnKeyBoardHideListener onKeyBoardHideListener;
public void setOnKeyBoardHideListener(OnKeyBoardHideListener onKeyBoardHideListener) {
this.onKeyBoardHideListener = onKeyBoardHideListener;
}
public interface OnKeyBoardHideListener {
void onKeyHide(int keyCode, KeyEvent event);
}
}
设置键盘隐藏监听,键盘隐藏时回调
mEditText.setOnKeyBoardHideListener(new ListenKeyboardEditText.OnKeyBoardHideListener() {
@Override
public void onKeyHide(int keyCode, KeyEvent event) {
//do something
}
});
方法2
监听view视图树
public class KeyboardChangeListener implements ViewTreeObserver.OnGlobalLayoutListener {
private static final String TAG = "ListenerHandler";
/**
* 当前界面的根视图
*/
private View mContentView;
/**
* 此时根视图的高度
*/
private int mOriginHeight;
/**
* 改变之前根视图的高度
*/
private int mPreHeight;
private KeyBoardListener mKeyBoardListen;
public KeyboardChangeListener(Activity activity) {
if (activity == null) {
Log.i(TAG, "contextObj is null");
return;
}
mContentView = findContentView(activity);
if (mContentView != null) {
addContentTreeObserver();
}
}
private View findContentView(Activity activity) {
return activity.findViewById(android.R.id.content);
}
private void addContentTreeObserver() {
mContentView.getViewTreeObserver().addOnGlobalLayoutListener(this);
}
@Override
public void onGlobalLayout() {
// 先获取到当前根视图的高度
int currHeight = mContentView.getHeight();
if (currHeight == 0) {
return;
}
boolean hasChange = false;
if (mPreHeight == 0) {
mPreHeight = currHeight;
mOriginHeight = currHeight;
} else {
if (mPreHeight != currHeight) {
hasChange = true;
mPreHeight = currHeight;
} else {
hasChange = false;
}
}
if (hasChange) {
boolean isShow;
int keyboardHeight = 0;
// 当当前的根视图高度和初始化时的高度一样时,说明此时软键盘没有显示,是消失状态
if (mOriginHeight == currHeight) {
//hidden
isShow = false;
} else {
// 此时,根视图的高度减少了,而减少的部分就是软键盘的高度,软键盘显示状态
//show
keyboardHeight = mOriginHeight - currHeight;
isShow = true;
}
if (mKeyBoardListen != null) {
mKeyBoardListen.onKeyboardChange(isShow, keyboardHeight);
}
}
}
public void setKeyBoardListener(KeyBoardListener keyBoardListen) {
this.mKeyBoardListen = keyBoardListen;
}
// 资源释放
public void destroy() {
if (mContentView != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
mContentView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
}
}
public interface KeyBoardListener {
void onKeyboardChange(boolean isShow, int keyboardHeight);
}
}
private KeyboardChangeListener mKeyboardChangeListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_curve_config);
mKeyboardChangeListener = new KeyboardChangeListener(this);
mKeyboardChangeListener.setKeyBoardListener(new KeyboardChangeListener.KeyBoardListener() {
@Override
public void onKeyboardChange(boolean isShow, int keyboardHeight) {
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
mKeyboardChangeListener.destroy();
}
多个EditText添加addTextChangedListener时共用一个TextWatcher
@Override
public void afterTextChanged(Editable editable) {
if (editable == mEditText1.getEditableText()) {
// DO STH
} else if (editable == mEditText2.getEditableText()) {
// DO STH
}
}
该方法原理是对比editable的地址引用因此只能用在afterTextChanged方法中