如何在5.0英寸及以下设备中编程隐藏软键盘并获取设备尺寸?
解决方法:获取设备物理屏幕尺寸并隐藏软键盘
我懂你的痛点——你想在5.0英寸及以下的设备上自动隐藏软键盘,但现有的代码没法精准判断物理屏幕尺寸,因为screenLayout的分类逻辑是基于像素密度和系统定义的尺寸档位,和真实的物理英寸数没有直接对应关系(比如有些5英寸高像素密度的设备会被归类为LARGE)。下面给你两种可靠的方案:
方案一:兼容大部分Android版本的物理尺寸计算
通过DisplayMetrics获取屏幕的像素数和每英寸像素密度(dpi),再用勾股定理计算对角线的物理英寸数:
// 获取屏幕的DisplayMetrics信息 DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getRealMetrics(metrics); // 计算宽高的物理英寸数 float widthInches = metrics.widthPixels / metrics.xdpi; float heightInches = metrics.heightPixels / metrics.ydpi; // 计算屏幕对角线的英寸数(勾股定理) double screenInches = Math.sqrt(Math.pow(widthInches, 2) + Math.pow(heightInches, 2)); // 判断是否≤5.0英寸,执行隐藏软键盘操作 if (screenInches <= 5.0) { getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN | WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN ); }
注:getRealMetrics会获取屏幕的真实像素尺寸(包括系统状态栏、导航栏等区域),比旧的getMetrics更准确。
方案二:适配Android 10+的更精准方式
对于Android 10(API 29)及以上的设备,尤其是折叠屏、全面屏这类特殊形态的设备,可以用WindowManager的新API来获取更准确的屏幕信息:
WindowManager windowManager = getSystemService(WindowManager.class); DisplayMetrics metrics = new DisplayMetrics(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // Android 11+用getCurrentWindowMetrics获取当前窗口的真实尺寸 windowManager.getCurrentWindowMetrics().getBounds().roundOut(metrics); } else { // Android 10用getRealMetrics兼容 windowManager.getDefaultDisplay().getRealMetrics(metrics); } // 计算物理英寸数 float widthInches = metrics.widthPixels / metrics.xdpi; float heightInches = metrics.heightPixels / metrics.ydpi; double screenInches = Math.sqrt(Math.pow(widthInches, 2) + Math.pow(heightInches, 2)); // 隐藏软键盘逻辑 if (screenInches <= 5.0) { getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN | WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN ); }
为什么你的原代码不生效?
你之前用的screenLayout分类是安卓系统基于像素范围定义的档位:
SCREENLAYOUT_SIZE_SMALL:对应约320x426像素以下的屏幕SCREENLAYOUT_SIZE_NORMAL:对应约320x470到480x800像素的屏幕
这个分类和物理英寸没有直接关联——比如一台5英寸的1080P设备,因为像素密度高,会被系统归类为SCREENLAYOUT_SIZE_LARGE,所以你的判断逻辑会漏掉这类设备。
内容的提问来源于stack exchange,提问作者Venkatesh Kashyap
相关产品推荐
相关产品推荐

