Android 资源文件匹配

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 资源文件匹配相关的知识,希望对你有一定的参考价值。

参考技术A

一直以来对于系统选择资源文件的流程都模糊不清,每次定义资源的时候都战战兢兢,终于忍无可忍,无需再忍,决定掏出官方文档来仔细瞧一瞧。摘要记录,以防忘记。

官方文档

一个简单的项目目录如下所示:

其中资源文件放置在res目录下,res支持的资源目录和类型如下:

对于一个资源文件,针对设备的不同,需要提供一整套的资源文件供程序运行时根据设备和运行条件(横屏或者竖屏、移动还是联通)的不同来选择合适的资源文件。
资源文件必须名称相同地放置到合适的资源文件夹下面,而 资源文件夹的命名至关重要 。资源文件夹必须严格按照“资源类型名称-配置1-配置2-...”的方式进行命名,如图2中,drawable是资源类型,hdpi是一个分辨率的配置。在drawable-hdpi和drawble文件夹中分别放置相同名称的高分辨率和默认配置的2个资源文件。

设备在运行时选择资源的标准就是按照资源文件夹的命名来匹配选择最优的资源文件。 设备按如下表的配置顺序依次匹配来选择最佳的资源(注意: 下表的配置仅为主要配置,不是全部。 ):

对于资源文件夹的命名必须按照上表中的顺序依次配置,切不可倒置。

android系统按照如图3所示进行资源的匹配选择。

例如app有以下资源文件夹:
drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/

系统配置:
运营商 = mcc400-mnc00
语言区域 = en-rGB
屏幕方向 = port
屏幕密度 = hdpi
触屏类型 = nottouch

开始选择:

请确保 每种配置都有一个默认的资源可以进行选择 ,这样在出现设备没有任何匹配文件夹的情况下可以选择默认的文件夹中的资源而不至于导致系统崩溃。例如,如果我们只配置2种文件夹values-en,values-zh,那么在设备语言为法语(fr)的情况下,按照先移除冲突的资源文件夹的准则,这2个资源文件夹都被移除了已经没有其他可以选择的资源文件了,系统会崩溃, 所有任何资源文件夹都请保留一个默认名称的资源文件夹

有时候有些资源希望在不同的配置下可以服用,例如一个很大的背景图片希望在语言为中文(zh)和英文(en)的情况下都使用,这时候如果在drawable-zh和drawable-en的文件夹下面都放置一种图片当然是可以的,只是这样会造成apk的体积过大。这时候可以将此图拷贝到drawable/文件夹下命名为icon_zh_en,而在
drawable-en和drawable-zh文件夹下分别保存下面的icon.xml文件,那么同样载en和zh的配置下也可以通过引用R.drawable.icon引用到图片,从而对apk瘦身。同样对于资源文件、数组、布局文件都可以使用别名来引用以达到避免资源重复的问题。

错误:(1)检索项目的父项时出错:找不到与给定名称“android:TextAppearance.Material.Widget.Button.Inverse”匹配的资源[重复]

【中文标题】错误:(1)检索项目的父项时出错:找不到与给定名称“android:TextAppearance.Material.Widget.Button.Inverse”匹配的资源[重复]【英文标题】:Error:(1) Error retrieving parent for item: No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Inverse' [duplicate] 【发布时间】:2016-03-18 14:49:16 【问题描述】:

我的 Android Studio 运行良好。但是当我尝试使用 Master-Detail Flow 布局创建一个新项目时,我遇到了这些错误。 现在我创建的任何项目都会给我同样的错误。

C:\Users\Lucas\Documents\PopularMovies2\app\build\intermediates\exploded-aar\com.android.support\appcompat-v7\23.1.1\res\values-v23\values-v23.xml
Error:(1) Error retrieving parent for item: No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Inverse'.
Error:(1) Error retrieving parent for item: No resource found that matches the given name 'android:Widget.Material.Button.Colored'.

我该怎么办?

这是 Gradle 文件:

    apply plugin: 'com.android.application'

android 
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig 
        applicationId "com.example.lucas.popularmovies2"
        minSdkVersion 10
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    
    buildTypes 
        release 
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        
    


repositories 
    mavenCentral()


dependencies 
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.squareup.picasso:picasso:2.5.2'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:support-v4:23.1.1'

谢谢。

【问题讨论】:

【参考方案1】:

如果您使用库com.android.support:appcompat-v7:23.1.1com.android.support:support-v4:23.1.1,请尝试使用buildToolsVersion,compileSdkVersiontargetSdkVersion = 23:

...
compileSdkVersion 23
buildToolsVersion "23.0.1"

defaultConfig 
    applicationId "com.example.lucas.popularmovies2"
    minSdkVersion 10
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"

...

另外,您可以将 appcompat 版本更改回 22.2.1 或更低

【讨论】:

【参考方案2】:

您的问题是您针对 compileSdkVersion 22 进行编译,但支持库需要版本 23 作为您的 gradle 文件。支持库适用于 sdk 版本。所以 v4:23 表示 compileSdkVersion 23。所以在 gradle compileSdkVersion 22 中更改为compileSdkVersion 23

【讨论】:

以上是关于Android 资源文件匹配的主要内容,如果未能解决你的问题,请参考以下文章

未找到与给定名称匹配的资源(在 'dialogCornerRadius' 处,值为 '?android:attr/dialogCornerRadius')

Android 项目中的资源获取方法

Android Gradle安卓应用构建流程 ( 资源文件编译 )

android文件资源解析

appcompat-v7:21.0.0':找不到与给定名称匹配的资源:attr 'android:actionModeShareDrawable'

Android xml资源文件中@@android:type@*?@+含义和区别