// Set a slide in animation by getting an Animation from the Resources object mFlipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.hyperspace_in));
引用样式属性
您可以通过样式属性资源在当前应用的风格主题中引用某个属性的值。 通过引用样式属性,您可以不采用为 UI 元素提供硬编码值这种方式,而是通过为 UI 元素设置样式,使其匹配当前风格主题提供的标准变型来定制这些元素的外观。引用样式属性的实质作用是,“在当前风格主题中使用此属性定义的样式”。
要引用样式属性,名称语法几乎与普通资源格式完全相同,只不过将 at 符号 (@
) 改为问号 (?
),资源类型部分为可选项。 例如:
?[<package_name>:][<resource_type>/]<resource_name>
例如,您可以通过以下代码引用一个属性,将文本颜色设置为与系统风格主题的“主要”文本颜色匹配:
<EditText id=“text” android:layout_width=“fill_parent” android:layout_height=“wrap_content” android:textColor=“?android:textColorSecondary” android:text=“@string/hello_world” />
在以上代码中,android:textColor
属性表示当前风格主题中某个样式属性的名称。Android 现在会使用应用于 android:textColorSecondary
样式属性的值作为 android:textColor
在这个小工具中的值。由于系统资源工具知道此环境中肯定存在某个属性资源,因此您无需显式声明类型(类型应为 ?android:attr/textColorSecondary
)— 您可以将 attr
类型排除在外。
使用Lint排除潜在的问题
Lint是Google专门为Android推出的代码检查工具,可以在编译期发现APP中潜在的问题。
菜单栏中Analyze -> Inspect Code 开始检查代码,项目越大耗时越长。
检查完成会自动打开Inspection窗口并显示结果,如下图所示:
我们重点来看一下Android Lint:
build.gradle文件
build.gradle文件结构
AS中APP所有的配置尽在一个build.gradle文件中,打包的时候也是解析build.gralde文件来打包的。结构如下所示:
apply plugin
用来指定用的是哪个插件
com.android.application
:Android APP插件(打包得到的是.apk文件)com.android.library
:Android库插件(打包得到的是.aar文件)
android
用来指定Android打包插件的相关属性
compileSdkVersion(apiLevel)
:设置编译时用的Android版本buildToolsVersion(buildToolsVersionName)
:设置编译时使用的构建工具的版本defaultConfig
:设置一些默认属性,其可用属性是buildTypes
和ProductFlavors
之和sourceSets
:配置相关源文件的位置,当你的项目的目录结构跟默认的有区别但又不想改的时候sourceSets就派上用场了aidl
设置aidi的目录assets
设置assets资源目录compileConfigurationName
The name of the compile configuration for this source set.java Java
源代码目录jni
JNI代码目录jniLibs
已编译好的JNI库目录manifest
指定清单文件name
The name of this source set.packageConfigurationName
The name of the runtime configuration for this source set.providedConfigurationName
The name of the compiled-only configuration for this source set.renderscript
Renderscript源代码目录res
资源目录setRoot(path)
根目录signingConfigs
:配置签名信息keyAlias
签名的别名keyPassword
密码storeFile
签名文件的路径storePassword
签名密码storeType
类型- buildTypes:配置构建类型,可打出不同类型的包。默认有
debug
和release
两种,你还可以在增加N种。 applicationIdSuffix
用于修改applicationId
,在默认applicationId
的基础上加后缀。在buildType
中修改applicationId
时只能加后缀,不能完全修改。debuggable
设置是否生成debug版的APKjniDebuggable
设置生成的APK是否支持调试本地代码minifyEnabled
设置是否执行混淆multiDexEnabled
Whether Multi-Dex is enabled for this variant.renderscriptDebuggable
设置生成的APK是否支持调试RenderScript代码renderscriptOptimLevel
设置RenderScript优化级别signingConfig
设置签名信息versionNameSuffix
修改版本名称,在默认版本名称的基础上加后缀。在buildType中修改版本名称时只能加后缀,不能完全修改zipAlignEnabled
设置是否对APK包执行ZIP对齐优化proguardFile(proguardFile)
添加一个混淆文件proguardFiles(proguardFileArray)
添加多个混淆文件setProguardFiles(proguardFileIterable)
设置多个混淆文件productFlavors
:配置不同风格的APP,在buildTypes
的基础上还可以让每一个类型的APP拥有不同的风格,所以最终打出的APK的数量就是buildTypes
乘以productFlavors
applicationId
设置应用IDmultiDexEnabled
Whether Multi-Dex is enabled for this variant.signingConfig Signing config used by this product flavor.testApplicationId
设置测试时的应用IDtestFunctionalTest
See instrumentation.testHandleProfiling
See instrumentation.testInstrumentationRunner
Test instrumentation runner class name.versionCode
设置版本号versionName
设置版本名称minSdkVersion(int minSdkVersion)
设置兼容的最小SDK版本minSdkVersion(String minSdkVersion)
设置兼容的最小版本proguardFile(proguardFile)
添加一个混淆文件proguardFiles(proguardFileArray)
添加多个混淆文件setProguardFiles(proguardFileIterable)
设置多个混淆文件targetSdkVersion(int targetSdkVersion)
设置目标SDK版本targetSdkVersion(String targetSdkVersion)
设置目标SDK版本testOptions
:设置测试相关属性reportDir
设置测试报告的目录resultsDir
设置测试结果的目录aaptOptions
:设置AAPT的属性failOnMissingConfigEntry
Forces aapt to return an error if it fails to find an entry for a configuration.ignoreAssets
Pattern describing assets to be ignore.noCompress
Extensions of files that will not be stored compressed in the APK.useNewCruncher
Whether to use the new cruncher.lintOptions
:设置Lint的属性dexOptions
compileOptions
:设置编译的相关属性packagingOptions
:设置APK包的相关属性splits
:设置如何拆分APK(比如你想拆分成arm版和x86版)
dependencies
:配置依赖
新特性:
Google在用Gradle最为Android打包工具的时候引入了 applicationId
的概念,这是为了 打多个不同ID的APK包 准备的。
applicationId
可以和清单文件中的 packageName
不一样,我们在代码中通过 getPackageName()
方法拿到的是 applicationId
,而清单文件中配置的packageName则仅作为 R.java
和 BuildConfig.java
的存放目录。
这样一来通过 Class.forName(getPackageName()+”.R”)
来获取 R
类的方式就行不通了,一定要注意。
打包
build.gradle
文件配置完成后,打开终端,进入项目目录下,执行 gradle build
即可打包,打包结束后在相应module的 build/outputs/apk/
目录下可以看到 .apk
文件。
如果你是在项目目录下执行的打包命令,那么会对项目中所有的 module
都打包,进入某个module目录下执行打包命令就只对当前module打包,每个module打包生成的APK或AAR都才存放在mudule的 build/outputs
目录下。
使用第三方库
1) 指定libs目录为jar库
目录的配置就是在build.gradle文件中,如下图所示:
2) Module之间的依赖
现在假如项目中有两个Module,一个 library
一个 sample
,现在sample要依赖library:
只需在 sample
的 build.gradle
文件中添加 compile project(':library’)
即可,如下图所示:
这里有个限制就是library必须library module,那么如何决定一个Module是不是library module呢,区别就在于build.gradle
文件的apply plugin
参数,例如:
sample的apply plugin参数的值是 com.android.application
,就说明这是个app
library的apply plugin参数的值是 com.android.library
,就说明这是个library
需要注意的是从1.0开始library module的build.gradle不再需要 applicationId
参数,如果有的请删除
3) 使用AAR
第三方的库无外乎两种情况:
- 一些基础功能库,例如图片加载、网络请求等,这些库只有一个jar文件;
使用的时候就很方便了直接放到libs目录下就可以了。
- 一些UI组件库,既包含有Java文件又有资源文件 eclipse里我们要么把第三方库弄成一个library项目(在studio中就是把第三方库弄成一个library Module)然后引用,要么就把第三方库里的所有文件融合到我们的项目中。这样很不方便,也很难维护。
Android官方在开发Android Studio的时候就发布了一种独有的格式AAR,专门用于打包UI组件库。与jar相比其多了一些UI组件用到的属性、图片等一系列文件,它的好处在于你不需要再多创建一个Library Module,只需引用这个AAR文件即可,Android Sudio会自动把AAR包里的文件跟你的项目融合。
1)) AAR包的内部文件结构
/AndroidManifest.xml (mandatory) /classes.jar (mandatory) /res/ (mandatory) /R.txt (mandatory) /assets/ (optional) /libs/*.jar (optional) /jni/<abi>/*.so (optional) /proguard.txt (optional) /lint.jar (optional)
2)) 优缺点
优点:使用方便,提升编译速度
缺点:不能方便的对AAR进行修改,Eclipse不支持AAR
- 因为AAR是Google在开发Android Studio的时候推出的,并且Google正在抛弃Eclipse转向Android Studio .
3)) 生成AAR包
在你的项目中创建一个library Module然后在终端中执行 grade build
,然后到 build/outputs/aar
目录下就能看到你的AAR文件。
4)) 使用本地AAR
以 recyclerview-v7-21.0.0.aar
为例,首先将AAR包放到libs文件夹下: