维护AutoLayout遇到的坑

一、前言

Android设备的碎片化,确实让开发者很头疼。Android设备成千上万,每台设备硬件设备各不相同。有的卖高价低配,有的卖低价高配,这里就不发表其他言论了。聊回正题,每台不同的Android设备,屏幕参数都有差异,主要的参数有三种:屏幕尺寸、屏幕分辨率、屏幕像素密度。

屏幕尺寸:即屏幕的物理尺寸
1英寸(inch)=2.54厘米(cm)

屏幕分辨率:即屏幕上显示的像素个数,屏幕尺寸一样的情况下,分辨率越高,显示效果就越精细和细腻。

屏幕像素密度:即没英寸屏幕所拥有的像素数,像素密度越大,显示效果越精细和细腻。
像素密度=√{(长度像素数^2+宽度像素数^2)}/ 屏幕尺寸

Density-independent pixel (dp)独立像素密度。标准是160dip.即1dp对应1个pixel,计算公式如:px = dp * (dpi / 160),屏幕密度越大,1dp对应 的像素点越多。
上面的公式中有个dpi,dpi为DPI是Dots Per Inch(每英寸所打印的点数),也就是当设备的dpi为160的时候1px=1dp;

了解完这些的话,基本上就知道什么叫坑了。

二、谷歌对适配提供的方案

  • PercentLayout
  • dp
  • ……

dp用鸿洋大神一句话的概括就是

dp能够让同一数值在不同的分辨率展示出大致相同的尺寸大小。但是当设备的尺寸差异较大的时候,就无能为力了

三、AutoLayout

先放上AutoLayout的项目地址:Github仓库链接

使用上,先设定设计图的大小,然后就是在布局中用px作为尺寸单位,就能在不同分辨率,不同尺寸和不同像素密度的屏幕上显示差异不大的效果。

因为AutoLayout已经停止维护了,不过看到该项目folk的数量还是挺多的。为了以后使用的便利,特意folk了一把,进行扩展。

clone下来后,在build项目的过程中,你可能首先把gradle的版本升成最新的,但是接下来你会一道一堆一连贯的错误。

1. Unable to load class ‘org.gradle.api.internal.artifacts.ImmutableModuleIdentifierFactory’

这里写图片描述
也就是
Error:Unable to load class ‘org.gradle.api.internal.artifacts.ImmutableModuleIdentifierFactory’.
Possible causes for this unexpected error include:

  • Gradle’s dependency cache may be corrupt (this sometimes occurs after a network connection timeout.)
    Re-download dependencies and sync project (requires network)
  • The state of a Gradle build process (daemon) may be corrupt. Stopping all Gradle daemons may solve this problem.
    Stop Gradle build processes (requires restart)
  • Your project may be using a third-party plugin which is not compatible with the other plugins in the project or the version of Gradle requested by the project.

百度无果后,在android-maven-gradle-plugin的github仓库的issues中找到了问题所在,具体看下图
android-maven-gradle-plugin与Gradle版本对比图

说明该插件的版本是与Gradle的版本对应的,而且在Gradle2.4之后,依赖的名称就变了,多了个gradle,此处我用的是Gradle2.3.3,所以使用com.github.dcendents:android-maven-gradle-plugin:1.4.1

2. Failed to resolve:com.android.support:*

这里我有个强迫症会把buildtool的版本升为最新(26.0.2),接着把下面的依赖也全改为26.0.2的,然后就出现错误。
这里写图片描述

这个问题在stackoverflow上找到了答案,在Project的build.gradle中修改为

allprojects {
repositories {
    jcenter()
    maven {
        url "https://maven.google.com"
    }
  }
}

3. cannot resolve R.styleable.Theme和R.styleable.Theme_actionBarTheme

对于这种情况,经过查阅https://developer.android.com,大概可以猜到,应该是修改了buildtools后出现的问题,Theme应该是旧版本才有的,Theme_actionBarTheme也一样。

所以,直接查找在android.support.v7.appcompat包中的R.styleable。可以找到R.styleable.AppCompatTheme,搜索一些actionBarTheme,可以找到对应的R.styleable.AppCompatTheme_actionBarTheme,替换进去即可,具体修改如下

R.styleable.AppCompatTheme —> R.styleable.AppCompatTheme
R.styleable.Theme_actionBarTheme —> R.styleable.AppCompatTheme_actionBarTheme

四、仓库地址

最后附上修改扩展后的仓库地址https://github.com/BisonQin/AutoLayout

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
============================================================== 兼容包实际上是为了让android 2.2、android 2.3 android 3.0支持android 4.0中才有的东西的。 比如说Actionbar。如果你不用兼容包的话,你开发含actionbar的程序就不可以在2.2上运行了 Support v11 v12 v13 v14 v17 Android 4.2.2 v18 Android 4.3.1 v21 Android 5.0.1 v22 Android 5.1.1 v23 Android 6.0 这个工程默认的是v21 Anroid 5.0.1, 如果需要编译(v22 Android 5.1.1 或者 v23 Android 6.0)版本,请 分别将values-v22 或者 values-v23 复制到 appcompat\res. 这是因为编译appcompat 需要SDK的部分资源,如果你需要编译v22版本的 appcompat-v7-v22.jar, 却将values-v23 复制到appcompat\res,那么会提示部分资源不存在,除非你选用v23的编译工具。 导入工程的方法见: http://blog.csdn.net/judyge/article/details/49228579 ============================================================== 出现这样的错误,说明你的工程缺乏appcompat V7 包 使用adt开发新建一个Android app,选择支持的SDK版本如果小于11(Android3.0)就会报如下错误。 error: Error retrieving parent for item: No resource found that matches the given name 'Theme.AppCompat.Light'. 官网给出的答案是: https://developer.android.com/tools/support-library/setup.html#add-library 简单来说就是新的eclipse默认模版主题UI需要使用比较高版本api,如果需要支持低版本,需要导入appCompact库来支持,网上一般给出的解法: File->Import (android-sdk\extras\android\support\v7). Choose "appcompat" Project-> properties->Android. In the section library "Add" and choose "appCompat" 包括stackoverflow上也有很多人遇到,但很多人通过这个解决,但我就是没办法解决。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值