针对不同xdpi设备创建对应dimens.xml文件的实现方案咨询
针对不同xdpi设备创建对应dimens.xml文件的实现方案咨询
嗨,这个场景我之前帮好几个开发者处理过类似的,咱们一步步来捋清楚怎么适配~
首先得明确:你的两个设备密度都是160(也就是mdpi),常规的values-mdpi文件夹会被两者共同读取,肯定区分不开。这时候就得用到Android更精准的物理xdpi限定符来创建专属资源文件夹,具体操作如下:
- 给旧设备(xdpi=213)创建专属资源文件夹:
res/values-xdpi213/,把适配旧设备的尺寸配置写在这个文件夹下的dimens.xml里 - 给新设备(xdpi=215)创建:
res/values-xdpi215/,对应的适配尺寸放在这里的dimens.xml - 最后保留根目录的
res/values/文件夹作为兜底,里面放通用的默认尺寸,防止遇到其他设备时没有适配值
你的项目资源结构最终会是这样:
res/ values/ dimens.xml // 默认通用配置 values-xdpi213/ dimens.xml // 旧设备专属尺寸 values-xdpi215/ dimens.xml // 新设备专属尺寸
Android系统会自动识别当前设备的物理xdpi值,优先加载最匹配的资源文件夹里的dimens.xml,如果找不到精确匹配的,才会 fallback 到默认的values文件夹。
要是你觉得文件夹的方式有点麻烦,也可以用代码动态适配:在运行时获取设备的xdpi值,再针对性地设置控件尺寸,比如:
val displayMetrics = resources.displayMetrics val deviceXdpi = displayMetrics.xdpi val targetSize = when (deviceXdpi) { 213f -> resources.getDimension(R.dimen.old_device_item_height) 215f -> resources.getDimension(R.dimen.new_device_item_height) else -> resources.getDimension(R.dimen.default_item_height) } // 把尺寸赋值给控件 yourTextView.layoutParams.height = targetSize.toInt()
不过这种方式需要在代码里逐个处理控件,不如资源文件夹的方式优雅,更推荐用资源限定符的方案,符合Android原生的适配规范。
备注:内容来源于stack exchange,提问作者Eric de Haan
相关产品推荐
相关产品推荐

