美文网首页Android 踩坑记Android技术Android开发进阶
Android关于Theme.AppCompat相关问题的深入分

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

作者: 小池laucherish | 来源:发表于2015-08-20 09:34 被阅读84249次

    先来看这样一个错误:

    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.LightTheme.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.LightTheme.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兼容包。

    解决方案

    此时的解决方法有如下几种:

    1. 既然没有找到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>
    
    1. 那如果没有找到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>
    
    1. 当然以上都不是最好的方法,只是提供一种思路。最好的方法就是导入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相关的问题应该不再是问题了。欢迎大家留言讨论。

    最后打一个广告

    纯净日报 https://github.com/laucherish/PureZhihuD
    一个采用 RxJava + Retrofit + OkHttp 框架实现的开源软件

    纯净日报界面

    原文地址:http://www.jianshu.com/p/6ad7864e005e 转载请注明出处

    相关文章

      网友评论

      • 阿飞咯:升级的build_tools,选择的platform
      • 工藤新一6666:你好! 我想问一下为什么Android SDK Manager中Extras中没有Android Support Library改怎么弄啊!
        谢谢大神😊😊😊😊
        f569f57eb4d0:你这个问题现在解决了么? 我的sdk 里面也没有这个
      • cfe1c1fef66e:感谢作者分享 么一个先
      • b0459452139f:感谢,被这个问题折磨了好久
      • wmjwmj:导入V7包后没找到Theme.AppCompat.Light.NoActionBar,怎么解决呢
      • 饵心:Android小白收教了,谢谢
      • 789cb550bc4e:第一次看到如此详尽的解答,太有用!
      • Kingcee:这是导入项目中的JAR包,项目一关闭还是会出错。
      • 5118a267680f:很喜欢的demo,下载了,怎么运行不了啊
      • 092e76519cd8:谢谢我对style还不熟悉,要好好看看
      • XiaLong:总结的相当好,想了解动态改变主体颜色的看这里http://www.jianshu.com/p/1cd30cedb5d7
      • code920:第二种解决方法中,将minSdkVersion改成14。改为14代表应用不会再低于14的android版本上运行。这时候为什么还需要修改values,values-v11,values-v14目录下的styles.xml文件里面style 的值呢“?
      • 8caa84f78b15:谢谢,解开了一直以来对主题的疑惑 :relaxed:
      • 李斯维:Eclipse。。。
      • 大侠咕咚:思路很清晰,赞!
      • 妙法莲花1234:收获颇多,谢谢,原来v7库是这个东西,受教了
      • YungFan:一直采用的解决方法是换主题,现在明白了。mark一下
      • lsxiao:为什么还在用Eclipse,是因为要写C++吗?
        karonl:@lsxiao 现在Android Studio也支持C++啊
        小池laucherish:@lsxiao 公司项目需要
      • 小池laucherish:欢迎大家讨论 :smiley:
        lonely_iron:你好。我的V7库为什么导入不进去

      本文标题:Android关于Theme.AppCompat相关问题的深入分

      本文链接:https://www.haomeiwen.com/subject/socgqttx.html