一、碎片化问题:
众所周知,随着Android的发展,最让一般程序员头疼的就是碎片化的问题,碎片化包括,语言碎片化,平台版本碎片化,设备尺寸碎片化,以及设备功能碎片化(某些传感器等)的问题。
1.语言碎片化:
1)创建语言目录,以及对应的字符串文件,如:res/values/strings.xml、res/values-es/strings.xml、res/values-zh-rCN/strings.xml等等。
2)使用资源字符串,Android系统可以根据系统语言自动识别加载对应文件夹里的字符串资源。
2.设备功能碎片化:
1)Android针对软硬件功能提供了不同id,可以用以检测设备是否存在该功能,如果不存在可以在Manifest中设置不允许安装。如,罗盘传感器的功能ID为FEATURE_SENSOR_COMPASS等。
Manifest:
<manifest ... >
<uses-feature android:name="android.hardware.sensor.compass"
android:required="true" />
...
</manifest>
当required为true时,如果该设备不包含该设备或功能,app就不会被安装。
2)当功能不是必须的时候,即required为false时,可以选择在运行时通过hasSystemFeatrue()检测是否含有该功能。
PackageManager pm = getPackageManager();
if (!pm.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)) {
// This device does not have a compass, turn off the compass feature
disableCompassFeature();
}
3.平台版本碎片化:
1)指定最小支持版本与目标版本。
<manifest ... >
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" />
...
</manifest>
minSdkVersion用以表示兼容的最小版本。targetSdkVersion用以表示已经优化的最高版本,例如4.4以上的版本对于AlarmManager的优化,使得set()与setRepeating()变得不再准确,如果使用19之前的targetSdkVersion这将会引起一些问题。
2)代码中检查:
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
// 低于某些版本时可以选择老版本的方法,或者不使用该方法
disableDragAndDrop();
}
根据当前设备版本来决定功能的实现方式,甚至是放弃该功能。3)使用平台样式以及主题:
<activity android:theme="@android:style/Theme.Dialog">
使用底层操作系统的style和theme。通过使用这些内置的样式和主题,应用将适应每个新版本的Android的外观和感觉。
4.设备尺寸碎片化:
1)针对不同的屏幕大小,创建不同的layout。
如:res/layout/main.xml、res/layout-large/main.xml等等。
2)针对不同的屏幕密度,提供不同的图片。
xhdpi:2.0, hdpi:1.5, mdpi:1.0, ldpi:0.75,即,为xhdpi提供一张200*200的图片,那么对应的,hdpi:150*150,mdpi:100*100,ldpi:75*75.
但是通常我们只提供xhdpi就足够了,现在还有xxhdpi:3.0以及xxxhdpi。
5.其他的适配建议:
1)字体用sp;
2)尺寸用dp;
3)多用match_parent与wrap_content以及layout_weight,不用指定的尺寸;
4)不用绝对布局。
5)使用.9.png