Android 监听软键盘打开和关闭
先上图
这是一个大佬的方法,封装好了类,直接拿去调用一下就可以了很方便
这里找不到大佬的原文链接。因为我发现网上很多这个代码,参数注释一模一样,就是年代不一样。。。分不清。我这也是一样的,懒得自己封装了,代码已经被我净化了,没啥可以删除的了,注释留着帮助小白。
注意事项在文章末尾
重点1:创建一个空类,直接把这个代码块粘进去,完成第一步
import android.app.Activity;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewTreeObserver;public class SoftKeyBoardListener {
private View rootView;//activity的根视图
int rootViewVisibleHeight;//纪录根视图的显示高度
private OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener;public SoftKeyBoardListener(Activity activity) {
//获取activity的根视图
rootView = activity.getWindow().getDecorView();//监听视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变
rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//获取当前根视图在屏幕上显示的大小
Rect r = new Rect();
rootView.getWindowVisibleDisplayFrame(r);int visibleHeight = r.height();
if (rootViewVisibleHeight == 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;
return;
}}
});
}private void setOnSoftKeyBoardChangeListener(OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) {
this.onSoftKeyBoardChangeListener = onSoftKeyBoardChangeListener;
}public interface OnSoftKeyBoardChangeListener {
void keyBoardShow(int height);void keyBoardHide(int height);
}public static void setListener(Activity activity, OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) {
SoftKeyBoardListener softKeyBoardListener = new SoftKeyBoardListener(activity);
softKeyBoardListener.setOnSoftKeyBoardChangeListener(onSoftKeyBoardChangeListener);
}
}
重点2:在你所需要监听软键盘java部分的初始化中,加入如下监听代码
SoftKeyBoardListener.setListener(this, new SoftKeyBoardListener.OnSoftKeyBoardChangeListener() { @Override public void keyBoardShow(int height) { Toast.makeText(MainActivity.this, "输入法打开", Toast.LENGTH_SHORT).show(); } @Override public void keyBoardHide(int height) { Toast.makeText(MainActivity.this, "输入法关闭", Toast.LENGTH_SHORT).show(); } });
重点3:你已经完成了对软件盘的监听,结束
分析:网上大部分解决方法都是根据获取activity视图树的监听进行判断的,当应用展示在屏幕前的部分减小一定量之后判断是软键盘弹出来了。
ViewTreeObserver.OnGlobalLayoutListener()
虽然这个管用,但也有bug
当发生横屏,分屏操作,这代码就失效了,如果用户手机上有一些系统弹窗或者第三方应用的弹窗出现在应用最上层,可能会误判,出毛病
不知道为什么android没提供输入法的相关接口,求解