Android兼容性小总结(一)

前言

在完美完成过年增肥任务之后,新的一年又得投入到工作当中了,今天是新年的第一篇博客,我们来讨论一下Android开发经久不变的兼容性问题。

国内有很多的厂商都定制了自己的安卓系统,谁也不知道会他们私底下都做了哪些操蛋的修改,再加上安卓版本的更新周期目前还是比较稳定,几乎每一年都会发布新的版本,例如去年的8.0。目前国内的Android系统主要是5.0和6.0,少量的4.x和7.0,掰掰手指头就5、6个,所以如何做好兼容性问题,一直是开发者,也是老板最关心的问题。

今天我准备简单介绍几个比较细节的例子,大家一起学习讨论下。

正文

我把兼容性问题主要分为两大类:

1、功能兼容问题,主要是系统版本的新特性,api的变化,或者是sdk定制导致部分api的执行结果出现差异导致的,一般需要重写方法,或者判断系统版本特殊处理。

2、布局兼容问题,主要是不同ViewGroup的特性和某些属性不能同时使用的问题,也可能是由不同Android系统版本自带的Theme或者其他特性导致的。

功能兼容问题

获得从相册选择的图片的路径

从相册选择图片,系统会返回给我们Uri,但是个别情况我们也需要得到路径,其实这就有一个兼容性问题,在不同系统版本的手机你会发现有的能得到路径,有的不能。

这是因为不同手机可能返回的Uri的Shceme,导致出现这个问题,我遇到这个问题是很久之前了,当时没有自己写总结,这里分享一个博客链接:http://blog.csdn.net/angcyo/article/details/52776904,供大家参考学习。

照相机拍照以及调用系统安装

从7.0以后,为了提高app安全,Android不允许app与其他app通信时,传递明文的文件路径,比较典型的例子就是app下载更新,安装的时候需要通过自己的ContentProvider对apk的路径进行加密,然后调用系统安装。

有的时候需要调用系统相机拍照,并且指定照片的保存路径。这个路径我们也必须加密,否则会直接崩溃,具体的解决办法我之前有写过:适配android7.0:获取文件的Uri

权限

在Android 6.0以及国内部分手机在Android 5.0开启了权限申请,部分敏感权限需要手动申请,所以如果你需要使用某些权限,一定要记得申请,网上这部分资料非常多,这里就不多说了。

ScrollView滑动到底部的问题

这个问题是最近才发现的,看来测试机多了还是有好处的,一般我们监听到ScrollView是否滑动到底部通过重写

onOverScrolled方法,判断clampedY是否是true,如果是true,表示滑动到了底部。

但是在部分手机上clampedY始终返回false,例如我发现的锤子手机。

解决办法:不仅要判断clampedY是否等于true,还要判断ScrollView的scrollY + getHeight + paddingTop + paddingBottom是否等于第一个子View的高度,下面贴出代码:

Theme兼容问题

使用Theme,推荐使用Theme.AppCompat下的主题,这样避免兼容性问题,如果你看到了你的错误提示:

说明你也是一个有故事的人了,我遇到多发生在Android 8.0 和 华为手机。

布局兼容问题

RelativeLayout子View的padding、margin和center属性的冲突

首先我们看一段代码:

在RelativeLayout设置paddingBottom=20dp,但是TextView设置了centerInParent并且设置了marginTop=50dp,会显示出什么效果呢?

很明显paddingBottom和marginTop都没有生效,同样的道理,子View的centerInHorizontal,centerInVertical属性也是和父View的padding和自身的margin是不能同时生效的。

Button的默认大小问题

这里我特意设置了text="hello button", 因为英文会让问题更明显,Button和TextView都是wrap_content,理论上应该是一样的效果,看一下展示图:

咦?很明显结果并不和我们预料的一样,强调一下我使用的sdk版本是26,如果你的展示效果和我的不一样,那就说明了一个问题:Button在不同的sdk中有不同的默认样式。

接下来我们看一看默认样式是什么:

当我们继续跟踪代码的时候出现了一个选择框:

这个主题在sdk 21以下 和sdk以上分别使用了两种主题,我们先看看sdk 21以下的style:

再看看sdk 21以上的style:

通过对比,我们发现两种主题的背景,字体样式是不同的,同时发现了有minWidth和minHeight,所以Button会有默认的大小,字母会全大写是textAppearance中定义的,感兴趣的朋友可以自己去看看里面还定义了哪些样式。

解决办法:设置Button的minWidth和minHeight等于0,你也可以按照你的需要修改其他的属性。

总结

上面的几点是我临时整理的,还有很多的内容都没有写出来,以后会慢慢补充,最后祝大家在新的一年里技术薪资双提升!!!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,842评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,067评论 19 139
  • 2017年5月17日 Kylin_Wu 标注(★☆)为考纲明确给出考点(必考) 常见手机系统(★☆) And...
    Azur_wxj阅读 1,850评论 0 10
  • 如果启动页不需要更换图片: 添加主题 使用主题 SplashActivity设置透明背景 如果启动页需要更换图片:...
    hjm1fb阅读 5,124评论 0 1
  • 不知冬日里,你是否见过井盖上的猫。在寒风瑟瑟中,那么三三两两的,盘坐在井盖上,有时候好奇,为啥哪怕是在路中央,猫还...
    whiSper19阅读 400评论 1 2