您的位置:首页 > 移动开发

Android关于Theme.AppCompat相关问题的深入分析

2016-10-26 08:52 260 查看


Android关于Theme.AppCompat相关问题的深入分析

原文地址:http://www.jianshu.com/p/6ad7864e005e 

先来看这样一个错误:

No resource found that matches the given name '@style/Theme.AppCompat.Light'


对于这个错误,相信大部分Android开发者都遇到过,可能很多朋友通过百度或者Google已经解决了这个问题,但是网上大部分都只给出了解决方法。

正所谓知其然,知其所以然,本文将从此问题出发,深入分析探讨导致此问题的原因、由其衍生出来的一系列问题及其解决方案。


Android Support Library

The Android Support Library package is a set of code libraries that provide backward-compatible versions of Android framework APIs as well as features that are only available through the library APIs.

Android的SDK版本很多,新的SDK版本包含了很多新的特性,为此Google官方提供Android Support Library package来保证高版本SDK的向下兼容。通过使用此包,可以让拥有最新SDK特性的应用运行在API lever 4(即Android 1.6) 及更高版本的设备之上。
v4 Support Library

此包用在API lever 4(即Android 1.6)及更高版本之上。它包含了较多的内容,使用非常广泛,例如:Fragment,NotificationCompat,LoadBroadcastManager,ViewPager,PageTabStrip,Loader,FileProvider 等。

v7 Support Libraries

此包是针对API level 7(即Android 2.1)及以上版本而设计的,但是v7是要依赖v4这个包的,v7支持了Action Bar以及一些Theme的兼容。

Note: v7 appcompat library

v7 appcompat library 是包含在 v7 Support Libraries里面的一个包,正是此包增加了Action Bar 用户界面的设计模式,并加入了对material
design 的支持,是我们使用最多的一个兼容包。

v13 Support Library

此包是针对API level 13(即Android 3.2)及更高版本设计的,一般我们都不常用,平板开发中能用到,这里就不过多介绍了。

v17 Preference Support Library for TV

看名字就知道了,此包主要是为了TV设备而设计。


Android Theme

Hoho Theme

在4.0之前Android可以说是没有设计可言的,在4.0之后推出了Android Design,从此Android在设计上有了很大的改善,而在程序实现上相应的就是Holo风格,所以你看到有类似 Theme.Holo.Light、 Theme.Holo.Light.DarkActionBar 就是4.0的设计风格,但是为了让4.0之前的版本也能有这种风格怎么办呢?这个时候就不得不引用v7包了,所以对应的就有 Theme.AppCompat.LightTheme.AppCompat.Light.DarkActionBar,如果你的程序最小支持的版本是API14(即Android
4.0),那么可以不用考虑v7的兼容。
Material Design Theme

Android在5.0版本推出了Material Design的概念,这是Android设计上又一大突破。对应的程序实现上就有Theme.Material.Light、 Theme.Material.Light.DarkActionBar等,但是这种风格只能应用在在5.0版本的手机,如果在5.0之前应用Material Design该怎么办呢?同样的引用appcompat-v7包,这个时候的Theme.AppCompat.LightTheme.AppCompat.Light.DarkActionBar就是相对应兼容的Material
Design的Theme。


问题分析

由此可以得出以下情形会导致本文一开始提出的问题。
项目使用的是Theme.AppCompat主题,具体表现为

项目values目录styles.xml文件里面style为
<resources>
<style name="AppBaseTheme" parent="Theme.AppCompat.Light"></style>
<style name="AppTheme" parent="AppBaseTheme"></style>
</resources>

AndroidManifest.xml文件里面
android:theme="@style/AppTheme"


项目支持的最小SDK小于API 14(即Android4.0),具体表现为

AndroidManifest.xml文件里面,
minSdkVersion
<14,比如
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="23" />


项目没有导入android-support-v7-appcompat兼容包。


解决方案

此时的解决方法有如下几种:
既然没有找到
Theme.AppCompat.Light
主题,那么我就不使用此主题。此时将项目values,values-v11,values-v14目录下的styles.xml文件里面的style都改为
<resources>
<style name="AppBaseTheme" parent="android:Theme.Light"></style>
<style name="AppTheme" parent="AppBaseTheme"></style>
</resources>


那如果没有找到
Theme.AppCompat.Light
主题,而我们又想要使用最新的主题效果呢,还有种方法就是将AndroidManifest.xml文件里面,
minSdkVersion
改成14,比如
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="23" />


此时再将项目values,values-v11,values-v14目录下的styles.xml文件里面style都改为
<resources>
<style name="AppBaseTheme" parent="android:Theme.Holo.Light"></style>
<style name="AppTheme" parent="AppBaseTheme"></style>
</resources>


当然以上都不是最好的方法,只是提供一种思路。最好的方法就是导入android-support-v7-appcompat库。下面具体介绍:

3.1 通过Android SDK Manager下载最新的Android Support Library。



img1.jpg

下载完成之后,可以在以下目录找到AppCompat library
android-sdk/extras/android/support/v7/appcompat


3.2 将此目录下的项目导入到Eclipse中



img2.jpg

3.3 右键点击我们的Android项目,选择Properties,左侧选择Android,在下方Library框里点击Add,最后选择appcompat_v7,确定。

此时问题就解决了。



img3.jpg

但在以上3.2导入appcompat_v7到Eclipse之后,有可能还会出现错误提示,比如
appcompat_v7\res\values-v23\styles_base.xml:20: error: Error
retrieving parent for item: No resource found that matches the given name 'android:Widget.Material.Button.Colored'.


出现此问题的原因是appcompat_v7已经更新到了最新版本并且高于编译环境的SDK版本,此时在Android SDK Manager将SDK及编译工具更新到最高版本



img4.jpg

升级完成之后右键点击appcompat_v7项目,选择Properties,选择Project Build Target 为最新版本,这样就OK了。



img5.jpg

通过以上的分析,相信朋友们以后再遇到AppCompat相关的问题应该不再是问题了。欢迎大家留言讨论。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: