先來看這樣一個(gè)錯(cuò)誤:
No resource found that matches the given name '@style/Theme.AppCompat.Light'
對(duì)于這個(gè)錯(cuò)誤闭专,相信大部分Android開發(fā)者都遇到過炸裆,可能很多朋友通過百度或者Google已經(jīng)解決了這個(gè)問題屿储,但是網(wǎng)上大部分都只給出了解決方法项玛。
正所謂知其然肉微,知其所以然抱环,本文將從此問題出發(fā)敬拓,深入分析探討導(dǎo)致此問題的原因老速、由其衍生出來的一系列問題及其解決方案协饲。
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特性的應(yīng)用運(yùn)行在API lever 4(即Android 1.6) 及更高版本的設(shè)備之上。
- v4 Support Library
此包用在API lever 4(即Android 1.6)及更高版本之上而线。它包含了較多的內(nèi)容铭污,使用非常廣泛恋日,例如:Fragment,NotificationCompat嘹狞,LoadBroadcastManager岂膳,ViewPager,PageTabStrip磅网,Loader谈截,F(xiàn)ileProvider 等。 - v7 Support Libraries
此包是針對(duì)API level 7(即Android 2.1)及以上版本而設(shè)計(jì)的涧偷,但是v7是要依賴v4這個(gè)包的簸喂,v7支持了Action Bar以及一些Theme的兼容。
Note: v7 appcompat library
v7 appcompat library 是包含在 v7 Support Libraries里面的一個(gè)包燎潮,正是此包增加了Action Bar 用戶界面的設(shè)計(jì)模式喻鳄,并加入了對(duì)material design 的支持,是我們使用最多的一個(gè)兼容包确封。
- v13 Support Library
此包是針對(duì)API level 13(即Android 3.2)及更高版本設(shè)計(jì)的除呵,一般我們都不常用,平板開發(fā)中能用到爪喘,這里就不過多介紹了竿奏。 - v17 Preference Support Library for TV
看名字就知道了,此包主要是為了TV設(shè)備而設(shè)計(jì)腥放。
Android Theme
- Hoho Theme
在4.0之前Android可以說是沒有設(shè)計(jì)可言的泛啸,在4.0之后推出了Android Design,從此Android在設(shè)計(jì)上有了很大的改善秃症,而在程序?qū)崿F(xiàn)上相應(yīng)的就是Holo風(fēng)格候址,所以你看到有類似 Theme.Holo.Light、 Theme.Holo.Light.DarkActionBar 就是4.0的設(shè)計(jì)風(fēng)格种柑,但是為了讓4.0之前的版本也能有這種風(fēng)格怎么辦呢岗仑?這個(gè)時(shí)候就不得不引用v7包了,所以對(duì)應(yīng)的就有 Theme.AppCompat.Light聚请、Theme.AppCompat.Light.DarkActionBar荠雕,如果你的程序最小支持的版本是API14(即Android 4.0),那么可以不用考慮v7的兼容驶赏。
- Material Design Theme
Android在5.0版本推出了Material Design的概念炸卑,這是Android設(shè)計(jì)上又一大突破。對(duì)應(yīng)的程序?qū)崿F(xiàn)上就有Theme.Material.Light煤傍、 Theme.Material.Light.DarkActionBar等盖文,但是這種風(fēng)格只能應(yīng)用在在5.0版本的手機(jī),如果在5.0之前應(yīng)用Material Design該怎么辦呢蚯姆?同樣的引用appcompat-v7包五续,這個(gè)時(shí)候的Theme.AppCompat.Light洒敏、Theme.AppCompat.Light.DarkActionBar就是相對(duì)應(yīng)兼容的Material Design的Theme。
問題分析
由此可以得出以下情形會(huì)導(dǎo)致本文一開始提出的問題疙驾。
- 項(xiàng)目使用的是Theme.AppCompat主題凶伙,具體表現(xiàn)為
項(xiàng)目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"
- 項(xiàng)目支持的最小SDK小于API 14(即Android4.0),具體表現(xiàn)為
AndroidManifest.xml文件里面它碎,minSdkVersion
<14镊靴,比如
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="23" />
- 項(xiàng)目沒有導(dǎo)入android-support-v7-appcompat兼容包。
解決方案
此時(shí)的解決方法有如下幾種:
- 既然沒有找到
Theme.AppCompat.Light
主題链韭,那么我就不使用此主題偏竟。此時(shí)將項(xiàng)目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" />
此時(shí)再將項(xiàng)目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>
-
當(dāng)然以上都不是最好的方法睦疫,只是提供一種思路。最好的方法就是導(dǎo)入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 將此目錄下的項(xiàng)目導(dǎo)入到Eclipse中
3.3 右鍵點(diǎn)擊我們的Android項(xiàng)目葫松,選擇Properties瓦糕,左側(cè)選擇Android,在下方Library框里點(diǎn)擊Add腋么,最后選擇appcompat_v7咕娄,確定。
此時(shí)問題就解決了珊擂。
但在以上3.2導(dǎo)入appcompat_v7到Eclipse之后圣勒,有可能還會(huì)出現(xiàn)錯(cuò)誤提示,比如
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'.
出現(xiàn)此問題的原因是appcompat_v7已經(jīng)更新到了最新版本并且高于編譯環(huán)境的SDK版本摧扇,此時(shí)在Android SDK Manager將SDK及編譯工具更新到最高版本
升級(jí)完成之后右鍵點(diǎn)擊appcompat_v7項(xiàng)目圣贸,選擇Properties,選擇Project Build Target 為最新版本扳剿,這樣就OK了旁趟。
通過以上的分析昼激,相信朋友們以后再遇到AppCompat相關(guān)的問題應(yīng)該不再是問題了庇绽。歡迎大家留言討論锡搜。
最后打一個(gè)廣告
純凈日?qǐng)?bào) https://github.com/laucherish/PureZhihuD
一個(gè)采用 RxJava + Retrofit + OkHttp 框架實(shí)現(xiàn)的開源軟件
原文地址:http://www.reibang.com/p/6ad7864e005e 轉(zhuǎn)載請(qǐng)注明出處