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);
}
}
软件盘收起时,
DecorView display hight = 768 , (少的32是手机顶部的状态栏)
DecorView hight = 800
软件盘弹出时,
DecorView display hight = 368 ,
DecorView hight = 800
我取了 displayhight / hight < 0.8 ,就认为软件盘处于显示状态。