安卓开发屏幕适配的一些坑

为了屏幕适配,在values增加了几个dimens.xml文件,如values-hdpi、values-xhdpi等,发现在某些设备上跑不起来了。
提示:

java.lang.UnsupportedOperationException: Can't convert to dimension: type=0x1
Binary XML file line #0: Error inflating class <unknown>

诸如此类的错误信息。
后来删掉屏幕适配的values-hdpi、values-xhdpi等文件夹,只留下默认values文件夹,果然可以了。

启发:屏幕适配有坑,每个dimens在不同文件夹下都要定义,否则可能会找不到某个尺寸,比如margin_left你在values-xhdpi文件夹的dimens文件里定义了,你必须也要在其他文件夹的dimens里定义。
这个确实很不智能,因为mipmap和drawable会自动寻找,但values确实不会自动寻找。

另附屏幕适配的方案:
在android3.2以前,所有的资源文件都有相应的xhdpi,hdpi,mdpi,ldpi四种文件来对应,android3.2以后,为了提供更精准的对布局文件的控制,可以通过为资源文件(res目录下文件)增加后缀来指定该文件夹里的xml布局文件或color.xml,string.xml是为哪种大小的屏幕使用。
第一种后缀:swdp,如layout-sw600dp, values-sw600dp
这里的sw代表smallwidth(最短屏幕宽度,单位为dp,比如你的屏幕分辨率为1920 x 1080,那么最短屏幕宽度为1080px。先算出你的屏幕密度context.getResources().getDisplayMetrics().density,假设为1.5,则换算为dp是1080/1.5=720,如果你有layout-sw320dp和layout-sw600dp两个文件夹,则会选择最接近的layout-sw600dp文件夹里面的值。)的意思,当你所有屏幕的最小宽度都大于600dp时,屏幕就会自动到带sw600dp后缀的资源文件里去寻找相关资源文件,这里的最小宽度是指屏幕宽高的较小值,每个屏幕都是固定的,不会随着屏幕横向纵向改变而改变。
第二种后缀wdp 如layout-w600dp, values-w600dp
带这样后缀的资源文件的资源文件制定了屏幕宽度的大于Ndp的情况下使用该资源文件,但它和swdp不同的是,当屏幕横向纵向切换时,屏幕的宽度是变化的,以变化后的宽度来与N相比,看是否使用此资源文件下的资源。

猜你喜欢

转载自blog.csdn.net/ithouse/article/details/78969608