第一步,先上工具类,通过监听根视图的高度变化来判断是否显示了软键盘
public class SoftKeyBoardListener {
@SuppressLint("StaticFieldLeak")
private Activity mActivity;
private int rootViewVisibleHeight; //纪录根视图的显示高度
private OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener;
private final View rootView; //activity的根视图
private final ViewTreeObserver viewTreeObserver;
private final ViewTreeObserver.OnGlobalLayoutListener onGlobalLayoutListener;
@SuppressLint("StaticFieldLeak")
private volatile static SoftKeyBoardListener instance;
public static SoftKeyBoardListener newInstance(Activity activity) {
if (instance == null) {
synchronized (SoftKeyBoardListener.class) {
if (instance == null) {
instance = new SoftKeyBoardListener(activity);
}
}
}
return instance;
}
public void clearInstance(){
mActivity = null;
if(viewTreeObserver.isAlive()){
viewTreeObserver.removeOnGlobalLayoutListener(onGlobalLayoutListener);
}
onSoftKeyBoardChangeListener = null;
instance = null;
}
private SoftKeyBoardListener(Activity activity) {
mActivity = activity;
//获取activity的根视图
rootView = mActivity.getWindow().getDecorView();
viewTreeObserver = rootView.getViewTreeObserver();
onGlobalLayoutListener = () -> {
//获取当前根视图在屏幕上显示的大小
Rect r = new Rect();
rootView.getWindowVisibleDisplayFrame(r);
int visibleHeight = r.height();
System.out.println(""+visibleHeight);
if (rootViewVisibleHeight == 0) {
if (onSoftKeyBoardChangeListener != null) {
onSoftKeyBoardChangeListener.keyBoardShow(0);
}
rootViewVisibleHeight = visibleHeight;
return;
}
//根视图显示高度没有变化,可以看作软键盘显示/隐藏状态没有改变
if (rootViewVisibleHeight == visibleHeight) {
return;
}
//根视图显示高度变小超过200,可以看作软键盘显示了
if (rootViewVisibleHeight - visibleHeight > 200) {
if (onSoftKeyBoardChangeListener != null) {
onSoftKeyBoardChangeListener.keyBoardShow(rootViewVisibleHeight - visibleHeight);
}
rootViewVisibleHeight = visibleHeight;
return;
}
//根视图显示高度变大超过200,可以看作软键盘隐藏了
if (visibleHeight - rootViewVisibleHeight > 200) {
if (onSoftKeyBoardChangeListener != null) {
onSoftKeyBoardChangeListener.keyBoardHide(visibleHeight - rootViewVisibleHeight);
}
rootViewVisibleHeight = visibleHeight;
}
};
viewTreeObserver.addOnGlobalLayoutListener(onGlobalLayoutListener);
}
public void setOnSoftKeyBoardChangeListener(OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) {
this.onSoftKeyBoardChangeListener = onSoftKeyBoardChangeListener;
}
public interface OnSoftKeyBoardChangeListener {
void keyBoardShow(int height);
void keyBoardHide(int height);
}
}
第二步,调用
/**
* 监听软键盘的收起和弹出
*/
protected void backgroundLayoutListener() {
SoftKeyBoardListener softKeyBoardListener = SoftKeyBoardListener.newInstance(activity);
softKeyBoardListener.setOnSoftKeyBoardChangeListener(new SoftKeyBoardListener.OnSoftKeyBoardChangeListener() {
@Override
public void keyBoardShow(int height) {
Log.d(TAG, "键盘显示 高度" + height);
}
@Override
public void keyBoardHide(int height) {
Log.d(TAG, "键盘隐藏 高度" + height);
disMissDialogAndCacheInfo();
softKeyBoardListener.clearInstance();
}
});
}