Android开发中,怎样监听键盘弹出收回事件( 三 )


■网友
这些回答一个都不能解决弹出全屏键盘的监听,弹出全屏键盘根本不会触发onGlobalLayout

■网友
一般的方案是监听跟布局的高度,但是设置不会顶起的属性,可能会有误差。暂时感觉都是有弊端

■网友
看了这个问题下的所有回答,我按照个人的理解稍微做一点总结.
监听键盘弹出通过 监听rootView的高度变化.
监听键盘收起 可以通过有一位层主提到的重写 Edittext.onKeyPreime() 方法.
不过也不完美.
如果想单纯的监听软键盘的弹出和收回感觉很难实现,一般都需要结合业务需求通过界面变化来感知.

■网友
我现在一直被这类问题困扰:
如果单纯的监听软键盘的弹出,楼上的方案,几乎没问题,包括软键盘的弹出和关闭监听的效果在界面不复杂的情况下,性能上面也不会太麻烦.
但是现在的方式onGlobalLayout监听布局的变化,本身比较对性能要求比较高,本人是做直播App 的,但是在直播间复杂页面,通过上述方法监听软键盘弹起,在做一些简单的动作,就会发现在低端机型巨卡顿,像小米4这种中端机型,卡顿不太明显,能接受.
就是在比较低端一点的机型,onGlobalLayout这个方法就吃力太多,每次弹出软键盘真的太卡了.这几天一直在研究怎么优化.头疼死了.

------- 后来我发现---造成卡顿是由于界面重绘导致的.------
监听软键盘收回,onGlobaLayout这种方式应该是比较不错的,可能还会有更合适的方法.

■网友
参考自:EditText获取和失去焦点,软键盘的关闭,和软键盘的显示和隐藏的监听 - 丶牛皮丶 - 博客园
【Android开发中,怎样监听键盘弹出收回事件】 亲测可用的, 原理和月恒的差不多
//监听软键盘是否显示或隐藏 mReplayRelativeLayout.getViewTreeObserver().addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect r = new Rect(); mReplayRelativeLayout.getWindowVisibleDisplayFrame(r); int screenHeight = mReplayRelativeLayout.getRootView() .getHeight(); int heightDifference = screenHeight - (r.bottom); if (heightDifference \u0026gt; 200) { //软键盘显示// changeKeyboardHeight(heightDifference); } else { //软键盘隐藏 } } });


推荐阅读