android 监听软件盘展示,收起

android应用程序开发中,有时需要知道软件盘的状态,是显示?还是隐藏?

android中没有提供直接的api接口,所以只好曲线救国了。


我们可以通过监听整个页面的布局变化,在页面布局变化时,跟据页面高度与设备实际高度的比较,来判断软件盘是否显示。


1,每个activity的根view都是一个DecorView,可以通过 activitity.getWindow().getDecorView().来得到。

2,然后注册ViewTreeObserver.OnGlobalLayoutListener 来监听layout变化。

3,在通过 view.getWindowVisibleDisplayFrame(Rect) 得到decorView的显示区域,进而得到显示高度。

4,得到设备实际高度。 我这里使用的是 decorView.getHeight() 

5,根据activity的显示高度,与设备实际高度比较,基本可以估算出软件盘显示状态。


代码如下:


public final class SoftKeyboardUtil {
	
	public static final String TAG = "SoftKeyboardUtil";
	public static void addOnSoftKeyBoardVisibleListener(Activity activity , final OnSoftKeyBoardVisibleListener 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();
				boolean visible = (double)displayHight / hight < 0.8;
				if(Log.isLoggable(TAG, Log.DEBUG)){
					Log.d(TAG ,"DecorView display hight = "+displayHight);
					Log.d(TAG ,"DecorView hight = "+ hight);
					Log.d(TAG, "softkeyboard visible = " + visible);
				}
				
				listener.onSoftKeyBoardVisible(visible);
			}
		});
	}
	
	
	
	public interface OnSoftKeyBoardVisibleListener{
		void onSoftKeyBoardVisible(boolean visible);
	}
}


在我的设备纵向像素为800。测试过程中,

软件盘收起时, 

      DecorView display hight = 768  , (少的32是手机顶部的状态栏) 

       DecorView hight = 800

软件盘弹出时,

      DecorView display hight = 368  , 

       DecorView hight = 800

我取了 displayhight / hight < 0.8 ,就认为软件盘处于显示状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值