刚接触Android开发的人打开一个工程,通常最先注意到的就是res目录。这个目录下密密麻麻的子文件夹,比如layout、drawable、values、mipmap、menu等,各自承担着不同的职责。其中使用频率最高的当属layout、drawable和values这三个目录,它们分别对应界面布局、图形资源和键值型资源。理解这三个目录的定位、命名规则和引用方式,是写好Android界面的基础,也能避免大量诸如R.id找不到、资源编译失败之类的常见问题。

layout目录:界面布局的家
layout目录用来存放所有描述界面结构的XML文件,每一个XML对应一个可以被setContentView()加载的布局。系统在编译时会为每个布局文件生成一个整数ID,例如res/layout/activity_main.xml会对应R.layout.activity_main。布局文件的根节点可以是各种ViewGroup,比如LinearLayout、ConstraintLayout、FrameLayout等,内部再嵌套具体的控件。
layout目录还支持屏幕适配的限定符命名。比如layout-land表示横屏时优先加载的布局,layout-sw600dp表示最小宽度为600dp的平板设备优先加载的布局,layout-xhdpi则针对超高密度屏幕。运行时系统会根据设备的实际配置,自动选择最匹配的目录中的文件。这种机制让同一套代码可以适配不同形态的设备,而不需要写任何判断逻辑。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_title" />
<Button
android:id="@+id/btn_confirm"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/btn_bg"
android:text="@string/btn_confirm_text" />
</LinearLayout>在代码中加载布局使用setContentView(R.layout.activity_main),在Activity中获取控件则调用findViewById(R.id.tv_title)。需要注意布局文件名只能包含小写字母、数字和下划线,否则编译阶段就会直接报错。
drawable目录:不止是放图片
很多初学者以为drawable目录就是单纯存图片的地方,实际上它的能力远不止于此。drawable目录可以存放PNG、JPG、WebP等位图文件,也可以存放shape、selector、layer-list等用XML定义的图形资源。用XML画图的好处是体积小、可以随意缩放而不失真,改颜色只需要改一个十六进制值。
shape标签是最常用的绘制方式之一,可以定义圆角矩形、实心颜色、描边和渐变。selector则用于定义状态相关的图形,比如按钮按下时变色、松开后恢复。下面的例子把两者结合起来,先定义一个圆角背景,再定义一个按下变色的选择器。
<!-- res/drawable/shape_btn_bg.xml -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#3F51B5" />
<corners android:radius="8dp" />
</shape>
<!-- res/drawable/selector_btn.xml -->
<lt;selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/shape_btn_pressed" />
<item android:drawable="@drawable/shape_btn_bg" />
</selector>drawable同样支持密度限定符,如drawable-hdpi、drawable-xhdpi、drawable-xxhdpi,用于为不同屏幕密度提供不同分辨率的同名图片。如果只在一个默认目录中放一张图,系统在其他密度设备上会自动缩放,可能带来模糊或内存浪费。引用方式在XML中是@drawable/文件名,在代码中是R.drawable.文件名,文件名同样必须符合小写字母加下划线的规则。
values目录:集中管理可复用的配置值
values目录存放的是键值对形式的资源,常见的文件有strings.xml、colors.xml、dimens.xml、styles.xml、arrays.xml等。把这些硬编码的值集中管理,一方面方便统一修改,另一方面是实现多语言适配的基础。比如字符串全部写在strings.xml中,只需要再建一个values-zh或values-en目录放对应语言的同名文件,系统就会根据设备语言自动切换。
colors.xml管理颜色值,dimens.xml管理尺寸,styles.xml和themes.xml管理样式与主题。样式可以把一组属性打包复用,主题则是应用到整个Activity或Application的样式。下面的示例展示了这几个文件的典型写法。
<!-- res/values/strings.xml -->
<resources>
<string name="app_title">资源目录示例</string>
<string name="btn_confirm_text">确 定</string>
</resources>
<!-- res/values/colors.xml -->
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorWhite">#FFFFFF</color>
</resources>
<!-- res/values/dimens.xml -->
<resources>
<dimen name="page_padding">16dp</dimen>
</resources>
<!-- res/values/styles.xml -->
<resources>
<style name="CommonButton" parent="Widget.AppCompat.Button">
<item name="android:textColor">@color/colorWhite</item>
<item name="android:textSize">14sp</item>
</style>
</resources>引用values资源时,字符串用@string/xxx,颜色用@color/xxx,尺寸用@dimen/xxx,样式用@style/xxx。在代码中则分别对应R.string.xxx、R.color.xxx等常量。值得强调的一点是,values目录下的文件名并不重要,资源真正的标识是name属性,理论上你把所有字符串塞进一个自定义文件也能正常编译,但为了可维护性,建议按约定分文件存放。
三个目录的协作关系与常见坑
实际开发中这三个目录是紧密配合的。一个按钮的完整外观,往往由layout中的位置尺寸、drawable中的背景图形、values中的文字和颜色共同决定。把它们拆分开的思路贯穿了Android整个资源体系:结构与样式分离、内容与配置分离。
常见的坑有几种。一是资源重名冲突,不同限定符目录下的同名文件是允许的,这正是适配机制的核心,但同一目录下两个文件资源名相同就会编译失败。二是引用了不存在的资源,比如XML里写了@drawable/icon但图片已经删除,这类错误在编译期就能暴露,但如果是动态拼接资源名再用getIdentifier()查找,就会在运行时返回0,排查起来更麻烦。三是把图片错放进mipmap目录之外又混淆使用,mipmap一般只用于启动器图标,普通图片应放在drawable下。
掌握layout、drawable、values三个目录的职责边界和引用规则之后,再去理解mipmap、menu、anim等其他资源目录就会轻松很多。整个res体系的设计哲学其实是一致的:用限定符目录做适配,用统一的引用语法做解耦,让资源管理和业务代码彻底分离。
Android资源目录layout布局drawable图片资源values资源文件修改时间:2026-09-11 14:51:35