部分手机,尤其是华为手机,底部会出现一个软键盘,这个是是可以设置的,让其消失,以下以华为手机为例说明。通常我们获取屏幕的宽高有几种方法,通用的
有
public static int getScreenHeight(Context context) {
DisplayMetrics dm = new DisplayMetrics();
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
wm.getDefaultDisplay().getMetrics(dm);
return dm.widthPixels;
}
结果,我是用了这个方法,却发现获取的高度与手机系统给出的高度不一样,有一点的差距,此时手机的软键盘是出于打开状态,如果把软键盘收起来,再调用这
个方法,两个数值就对上了。我就想,找下获取底部软键盘的高度的方法,如下
public static int getBottomBarHeight(Context context) {
int resourceId = 0;
int rid = context.getResources().getIdentifier("config_showNavigationBar", "bool", "android");
if (rid != 0) {
resourceId = context.getResources().getIdentifier("navigation_bar_height", "dimen", "android");
return context.getResources().getDimensionPixelSize(resourceId);
} else
return 0;
}
上面的方法就可以获取到软键盘的高度,如果软键盘没收起,我们想获取屏幕的高度,怎么办?google 实际上是提供了方法,只不过是在 4.4 新增的方法,
我们可以通过反射来获取试试
public static int getContainVirtualKey(Context context) {
int dpi = 0;
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
DisplayMetrics dm = new DisplayMetrics();
@SuppressWarnings("rawtypes")
Class c;
try {
c = Class.forName("android.view.Display");
@SuppressWarnings("unchecked")
Method method = c.getMethod("getRealMetrics", DisplayMetrics.class);
method.invoke(display, dm);
dpi = dm.heightPixels;
} catch (Exception e) {
e.printStackTrace();
}
return dpi;
}
既然我们知道了这个方法,那么可以通过版本的判断,直接调用,而非是使用反射,代码如下
public static int getPreenHeight(Context context) {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
wm.getDefaultDisplay().getRealMetrics(dm);
} else {
wm.getDefaultDisplay().getMetrics(dm);
}
int height = dm.heightPixels;
return height;
}
可以通过以上的方法,来判断软键盘是否处于收起状态,如果想把软键盘收起来,继续上代码
private void hideVirtualKeyBoard(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE);//API19
} else {
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
);
}
}