一、资源类型
1、项目资源目录(res/)
这是应用资源的主目录。其中的资源会在编译时被优化,并由系统自动生成 R.java 文件进行索引。按不同子目录区分资源类型,如布局、值、可绘制对象等。
2、原始资源(assets/)
用于存放保持原样的原始文件,不会生成 R 索引,需通过 AssetManager 访问。常见用途包括网页文件、数据库文件或大型资源。
3、应用图标资源(res/mipmap/)
专门用于存放应用图标,按屏幕密度分文件夹(如 mipmap-hdpi、mipmap-xhdpi),系统会针对不同密度自动缩放。
4、可绘制资源(res/drawable/)
包含多种图片和 XML 定义的图形:
位图文件:如 png、jpg、gif、webp 及 9-patch 图片(.9.png)
XML Drawable:如形状(shape)、状态列表(selector)、层列表(layer-list)、矢量图(vector)、动画选择器(animated-selector)等
5、布局资源(res/layout/)
通过 XML 定义应用界面布局,使用如 LinearLayout、ConstraintLayout 等容器及 Button、TextView 等组件。
6、值资源(res/values/)
存放各类简单值的 XML 文件:
strings.xml:字符串资源
colors.xml:颜色值
dimens.xml:尺寸(dp、sp、px)
styles.xml:样式与主题
arrays.xml:数组(字符串数组、整型数组等)
integers.xml、bools.xml 等
7、动画资源
res/anim/:补间动画(如 alpha、scale、translate、rotate)
res/animator/:属性动画(如 objectAnimator、valueAnimator)
res/transition/:场景过渡动画
8、菜单资源(res/menu/)
用于定义选项菜单、上下文菜单、弹出菜单,使用标签。
颜色状态列表资源(res/color/)
通过 XML 定义不同状态下的颜色变化(如按钮按下时颜色改变)。
XML 原始文件(res/xml/)
存放任意自定义的 XML 文件,通过 R.xml.filename 访问。
9、原始文件(res/raw/)
存放未经编译的任意原始文件(如音频、视频、JSON、txt 等),通过 R.raw.filename 访问。
10、字体资源
包括字体文件(如 .ttf、.otf)及通过 XML 定义的字体族(font-family)。
11、ID与属性资源
ids.xml:自定义 ID 资源
attrs.xml:自定义属性资源(declare-styleable)
二、布局资源的四种常用类型
布局资源位于 res/layout/ 目录下,用于定义 Activity、Fragment 或列表项的 UI 结构。以下是四种最常用的布局类型及其详细介绍:
1、LinearLayout 线性布局
定义与特点:
线性布局是最简单、最常用的布局之一。它将其包含的子控件按照垂直(Vertical)或水平(Horizontal)的方向线性排列。当控件排列到边缘后,后续控件会自动换行(水平排列时)或换列(垂直排列时,通常配合weight属性实现权重分配)。
核心属性:
android:orientation:必填属性。定义排列方向。
vertical:垂直排列。
horizontal:水平排列。
android:layout_weight:权重属性。用于按比例分配父容器的剩余空间。通常与 android:layout_width="0dp"(水平布局时)或 android:layout_height="0dp"(垂直布局时)配合使用,实现自适应屏幕尺寸。
android:gravity:控制布局内所有子控件的对齐方式(如 center、bottom、right)。
android:layout_gravity:控制当前控件相对于父容器的对齐方式。
应用场景:
适用于结构简单的排列,如导航栏、表单输入行、按钮组,或者利用权重实现等分屏幕的效果。
2、RelativeLayout 相对布局
定义与特点:
相对布局是通过控件之间的相对位置(如位于兄弟控件的左侧、上方)或控件相对于父容器的位置(如父容器底部对齐)来进行布局的。它非常灵活,可以减少布局的嵌套层级,但约束关系较多时逻辑相对复杂。
核心属性:
根据参照物不同,属性分为两类
相对于父容器(Parent)定位:
android:layout_alignParentTop="true":紧贴父容器顶部。
android:layout_alignParentBottom="true":紧贴父容器底部。
android:layout_centerInParent="true":位于父容器正中央。
相对于其他兄弟控件(ID)定位:
android:layout_above="@id/btn":位于指定控件的上方。
android:layout_below="@id/btn":位于指定控件的下方。
android:layout_toLeftOf="@id/btn":位于指定控件的左侧。
android:layout_toRightOf="@id/btn":位于指定控件的右侧。
android:layout_alignLeft="@id/btn":与指定控件的左边界对齐。
应用场景:
适用于复杂、不规则的界面布局,如登录界面中“用户名”标签与输入框的左右对齐,或者列表项中图标与文字的相对位置关系。
3、TableLayout 表格布局
定义与特点:
表格布局采用行(TableRow)和列的形式来管理子控件。它不需要显式声明列数,而是根据 TableRow 中的子控件数量自动确定列数。布局中的每一行都是一个 TableRow 对象,如果没有使用 TableRow 包裹,该控件会独占一行。
核心属性:
android:shrinkColumns:设置允许收缩的列(列号从0开始)。当某列内容过多导致宽度超出屏幕时,该列会被压缩。
android:stretchColumns:设置允许拉伸的列,用于填充屏幕剩余的空白空间。
android:collapseColumns:设置需要隐藏的列。
应用场景:
适用于规则排列的数据展示,如计算器界面、设置项列表、属性值对(Key-Value)的展示。
4、FrameLayout 帧布局
定义与特点:
帧布局是系统默认的最简布局方式。它会在屏幕上为每个控件创建一个“空白区域”(图层),所有添加到布局中的控件都会默认显示在屏幕的左上角(即重叠显示)。后添加的控件会覆盖在先添加的控件之上。由于这种特性,它通常用于承载单个控件,或者利用图层堆叠的特性实现特效。
核心属性:
android:foreground:设置前景图像。前景图像始终位于所有子控件的最顶层。
android:foregroundGravity:设置前景图像的对齐方式。
android:visibility:配合使用可以控制不同图层的显示与隐藏(常用于实现帧动画或Fragment切换)。
应用场景:
Fragment 的容器:在 Activity 中,FrameLayout 常作为 Fragment 的占位容器。
图层叠加效果:例如在图片上显示一个加载中的进度条,或者实现类似微信小视频的悬浮效果。
总结: 线性布局与相对布局是最常用的两种。线性布局逻辑简单,严格按垂直或水平方向线性排列,常配合权重实现比例分配,但容易产生过度嵌套;相对布局通过控件间的相对位置进行约束,能有效减少布局层级,但约束关系较为复杂。
表格布局采用行列结构,适合整齐的数据展示,但在现代开发中使用较少;帧布局为层叠覆盖模式,所有控件默认堆叠在左上角,通常只作为Fragment的单一容器使用。
总体而言,线性布局适用于简单线性结构,相对布局擅长处理复杂约束关系,帧布局专为图层叠加与容器场景设计,而表格布局现多已被更灵活的布局方式替代。