Android获取软键盘的高度

最近由于要实现一个类似微信朋友圈的功能,但是评论框位置总是不能精确的定位,因此只能自己计算坐标来手动调用scrollBy来滚动。在研究过程中遇到一个问题便是不能获取软键盘高度。

研究了网上很多方法,但是不能成功,无意中找到了解决方法。

首先先给出如何获取键盘高度的方法:

	interface IKeyBoardVisibleListener{
		void onSoftKeyBoardVisible(boolean visible , int windowBottom);
	}
	boolean isVisiableForLast = false;
	public void addOnSoftKeyBoardVisibleListener(Activity activity, final IKeyBoardVisibleListener listener) {
		final View decorView = activity.getWindow().getDecorView();
		decorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
			@Override
			public void onGlobalLayout() {
				Rect rect = new Rect();
				decorView.getWindowVisibleDisplayFrame(rect);
				//计算出可见屏幕的高度
				int displayHight = rect.bottom - rect.top;
				//获得屏幕整体的高度
				int hight = decorView.getHeight();
				//获得键盘高度
				int keyboardHeight = hight-displayHight;
				boolean visible = (double) displayHight / hight < 0.8;
				if(visible != isVisiableForLast){
					listener.onSoftKeyBoardVisible(visible,keyboardHeight );
				}
				isVisiableForLast = visible;
			}
		});
}

系统并没有给我们之间提供获取高度的Api,因此我们只能通过屏幕可见区域的高度相减来计算出软键盘高度。

当软键盘弹出时,rect.bottom会变小,而这个差值就是键盘高度。

OnGlobalLayoutListener这个监听器是在view的可见性和键盘弹出收回时会调用。

但是,有时还是会失效,我一开始这个方法就没有用,我的原因是:

在mianfest.xml文件的该Activity中加入了

android:windowSoftInputMode="adjustResize|adjustPan"
后来发现,只要加入adjustResize就会失效,事件不会回调,具体原因还不知道。

你可能感兴趣的:(android常见问题)