部分手机,尤其是华为手机,底部会出现一个软键盘,这个是是可以设置的,让其消失,以下以华为手机为例说明。通常我们获取屏幕的宽高有几种方法,通用的 有
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 ); } }