统一主题与风格

Android控件很多属性都有默认值,比如文字默认黑色、编辑框默认透明背景等等,但因为android是开源的,各厂商都会自行修修补补,所以很多时候默认值并不靠谱。举例如下:
1、在某些低版本的Android上,如不指定文字颜色textColor,则默认的文字颜色是白色;
2、编辑框有的默认透明背景加一根底线,有的默认白色圆角背景;
3、主题Theme.Holo默认是浅灰背景,但有的品牌手机上改成了深灰背景;
4、调用View的getDrawingCache方法对指定控件截图,默认背景是黑色,而不是我们在UI上看到的透明背景,是不是很惊讶?所以截图前要先设置好背景色。

所以,为了让app在不同设备上都是一样的显示风格,就得自己设置期望的各种属性值,另外也尽量不用系统自带的主题,如有可能自定义主题风格,这样即使设备厂商修改了默认属性值,app也仍然保持统一的风格。

兼容SDK各版本

Android每隔一段时间就会推出新版本与新的SDK,手机上的Android版本也是各不相同,从最早的2.2到4.0到5.0再到6.0,SDK里的API更新很频繁,有时候app用到高版本的api,同时又想兼容低版本的手机,可在工程中作如下处理:
1、AndroidManifest.xml里的uses-sdk标签,指定兼容的sdk最低版本号minSdkVersion,同时指定编译用的sdk目标版本号targetSdkVersion;
2、代码中判断当前设备的sdk版本号,即获取Build.VERSION.SDK_INT的值,判断当前版本号如果小于指定版本,则采取低版本的处理逻辑;如果当前版本号大于指定版本,则采取高版本的处理逻辑。
3、代码中有调用高版本api的地方,要在对应方法前加上“@TargetApi()”标签或者“@SuppressLint("NewApi")”标签,这两个标签的区别是:
@TargetApi() 只屏蔽某一新api开始才能使用的方法报的android lint错误;
@SuppressLint("NewApi") 屏蔽一切新api中才能使用的方法报的android lint错误;
注意,不管是TargetApi方式还是NewApi方式,都只能消除ADT的编译错误,app内部处理时,还是得依据Build.VERSION.SDK_INT做分支判断。

support包的兼容

Android的sdk还额外提供了几个支持包,包括android-support-v4.jar、android-support-v7-***.jar、android-support-v13.jar等等,推出支持包的目的是让低版本的Android也能使用高版本新增的控件。下面是支持包中常用的几个控件:
android.support.v4.view.ViewPager、android.support.v4.app.Fragment
android.support.v7.app.ActionBar、android.support.v7.app.ActionBarActivity
android.support.v13.app.FragmentTabHost

对于v4的控件,我们在代码中import相关类就好了,但是对于v7的控件,光光import是不够的。只是import支持包v7的控件类,虽然编译时没有问题,但运行时就会报错“java.lang.NoClassDefFoundError: android.support.v7.appcompat.R$styleable”。这是因为v7的完整包除了jar文件,还有资源文件,所以得把v7包作为一个库工程引用进来。

以android-support-v7-appcompat.jar为例,在ADT上依次选择菜单“File”——“Import”——“Existing Android Code Into Workspace”——“Next”,然后选择sdk安装目录下的appcompat路径,如“sdk\extras\android\support\v7\appcompat”。可是导入之后,编译又报错:“android:Widget.Material.ActionButton”找不到,解决办法是把project.properties中的“target=android-19”改为“target=android-23”,注意库工程和自己的工程都要改。

这下编译总算没问题了,博主兴冲冲启动app,没想到进入页面依然异常退出,日志报错“Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.”真是一波三折呀,出现该错误的缘由,是ActionBarActivity的派生类必须使用v7的appcompat主题,具体的解决办法要修改AndroidManifest.xml,找到指定类的标签,加上这么一个属性:“android:theme="@style/Theme.AppCompat.Light"”,重新编译运行,app就能正常使用了。

兼容5.0的水波动画

Android5.0之后新加了水波动画RippleDrawable,现在想在4.X系列的手机上使用水波效果,就要自定义水波控件了。其中经过博主验证,下面三个水波控件是可用的,其效果各有千秋,具体介绍如下:

1、RevealLayout
RevealLayout继承自LinearLayout,可用作视图背景水波,也可用作单个控件的水波。
RevealLayout标签可在布局文件中直接使用。
下载RevealLayout的代码可到 https://github.com/kyze8439690/RevealLayout

2、RippleView
RippleView继承自RelativeLayout,只可用做视图背景水波,也可用作单个控件的水波。
RippleView标签可在布局文件中直接使用。
下载RippleView的代码可到 https://github.com/traex/RippleEffect

3、MaterialRippleLayout
MaterialRippleLayout继承自FrameLayout,只可用做视图背景水波,但视图上如果有其它控件如按钮,则水波会被按钮遮挡住。
MaterialRippleLayout不可在布局文件中直接使用。要在代码中以如下方式调用:

     MaterialRippleLayout.on(layout1).rippleColor(Color.BLACK).rippleAlpha(0.2f).rippleHover(true).create();

下载MaterialRippleLayout的代码可到 https://github.com/balysv/material-ripple

点击下载本文用到的兼容水波动画的工程代码

点此查看Android开发笔记的完整目录

Android开发笔记(八十二)SDK版本兼容相关推荐

  1. Android开发笔记(十二)测量尺寸与下拉刷新

    尺寸测量的配置 控件宽和高的设置方式 大家知道,自定义视图的目的就是要在屏幕上显示期望的图案,那在绘制图案之前,我们得先知道这个图案的尺寸(如宽多少高多少). 一般在xml中给控件的宽和高有三种赋值方 ...

  2. Android开发笔记(一百二十三)下拉刷新布局SwipeRefreshLayout

    SwipeRefreshLayout 下拉刷新布局SwipeRefreshLayout是Android又一与时俱进的控件,顾名思义它随着用户手势向下滑动就会触发刷新操作.从实际的下拉效果来看,Swip ...

  3. Android开发笔记(一百二十二)循环器视图RecyclerView

    RecyclerView RecyclerView是Android在support-v7库中新推出控件,中文别名为循环器视图,它的功能非常强大,可分别实现ListView.GridView,以及瀑布流 ...

  4. Android开发笔记(一百二十六)自定义音乐播放器

    MediaRecorder/MediaPlayer 在Android手机上面,音频的处理比视频还要复杂,这真是出人意料.在前面的博文< Android开发笔记(五十七)录像录音与播放>中, ...

  5. Android开发笔记(一百二十八)手机制式适配

    查看运营商与网络类型 虽然现在4G网络很普及了,但是我国幅员辽阔,4G信号在某些地方接收不良,手机连接很容易掉到3G甚至2G网络.为了让用户在低速环境也能使用App的基础功能,而不至于还在老牛破车地缓 ...

  6. Android开发笔记(一百二十四)自定义相册

    画廊Gallery Gallery是一个早期的画廊控件,左右滑动手势可展示内嵌的图片列表,类似于一个平面的万花筒.虽然Android现在将Gallery标记为Deprecation(表示已废弃),建议 ...

  7. Android开发笔记(一百二十九)使用变换图形

    裁剪图形ClipDrawable ClipDrawable可设置图形的裁剪幅度,它的构造函数除了指定来源图形之外,还可以指定图形的裁剪方式(从开始裁剪还是从中间裁剪还是从末尾裁剪),以及裁剪方向(水平 ...

  8. Android开发笔记(十八)书籍翻页动画PageAnimation

    前面几节的动画都算简单,本文就介绍一个复杂点的动画--书籍翻页动画.Android有自带的翻页动画ViewPager,不过ViewPager只实现了平移效果.即便使用补间组合动画或者属性动画,也只是把 ...

  9. Android开发笔记(一百二十五)自定义视频播放器

    视频播放方式 在Android中播放视频的方式有两种: 1.使用MediaPlayer结合SurfaceView进行播放.其中通过SurfaceView显示视频的画面,通过MediaPlayer来设置 ...

  10. Android开发笔记(一百二十)两种侧滑布局

    SlidingPaneLayout SlidingPaneLayout是Android在android-support-v4.jar中推出的一个可滑动面板的布局,在前面< Android开发笔记 ...

最新文章

  1. 机器学习面试必备 CheatSheet
  2. 李飞飞高徒Andrej Karpathy用AI撰写内心独白:我的“进化”之路
  3. 使用.NET中的Action及Func泛型委托
  4. IO-6(PrintStream/PrintWriter)
  5. 数据科学竞赛-人脸表情识别
  6. LINUX之网络编程j简述
  7. java时间差的百分之二十,Java对日期Date类进行加减运算、年份加减月份加减、时间差等等...
  8. c语言-命令行选项_EWSTM8系列教程06_工程节点选项配置(一)
  9. PHP non-thread-safe和thread-safe这两个版本的区别
  10. SDP中fmtp的使用
  11. Linux性能测试工具
  12. 机器学习期末复习题题库-单项选择题
  13. Win10专业版如何安装Docker
  14. Problem A: 推理出今天是星期几
  15. WIN7 声音图标不见
  16. 【教学类-17-01】20221122《世界杯七巧板A4整页-随机参考图+七巧板+画框》(大班)
  17. Element Select选择器从服务器搜索数据,输入关键字进行查找(从服务器获得的数据有分页)
  18. rtsp有没有好使_求几个可用的稍微清晰点的RTSP播放源,最好是上海的!
  19. 如何实现远程控制网络设备
  20. DHCP服务器是什么?

热门文章

  1. Leetcode每日一题:121.best-time-to-buy-and-sell-stock(买股票的最佳时机)
  2. iOS 使用UILocalizedIndexedCollation实现区域索引标题(Section Indexed Title)即拼音排序...
  3. ireport学习笔记
  4. 台式计算机视频设备打不开,电脑视频设备被占用未能创建视频预览怎么办
  5. html大学生活主题班会,我的大学生活主题班会策划书
  6. l开头的英文车标是什么车_行业冷知识 | 为什么汽车品牌都喜欢用动物做车标?...
  7. mac 强制退出程序_教你强制退出程序!
  8. mysql 性能分析_十大MySQL性能分析工具汇总!专治MySQL性能瓶颈
  9. Java 调用Web service 添加认证头(soapenv:Header)
  10. java按钮添加事件_java中添加按钮并添加响应事件的方法(推荐)