跳到主要内容

Android学习笔记之应用资源

· 阅读需 4 分钟
Skyone
科技爱好者

在 Android 项目中加入的每一项资源,构建工具均会定义唯一的整型(Long) ID,通过这个 ID 来引用资源。例如,有一张叫 logo.png 的图像文件保存在 res/drawable/ 目录中,则构建工具会生成名为 R.drawable.logo 的资源 ID。

资源文件的存放位置

首先来看一下Android工程的目录结构:

MyProject/
manifests/
AndroidManifest.xml
java/
host.skyone.resource/
MainActivity.java
res/
anim/
color/
drawable/
skyone.png
layout/
activity_main.xml
menu/
xml/
raw/
mipmap/
icon.png
values/
strings.xml
目录资源类型
anim/定义动画属性的XML文件。它们被保存在res/anim/文件夹下,通过R.anim类访问
color/定义颜色状态列表的XML文件。它们被保存在res/color/文件夹下,通过R.color类访问
drawable/图片文件,如.png,.jpg,.gif或者XML文件,被编译为位图、状态列表、形状、动画图片。它们被保存在res/drawable/文件夹下,通过R.drawable类访问
layout/定义用户界面布局的XML文件。它们被保存在res/layout/文件夹下,通过R.layout类访问
menu/定义应用程序菜单的XML文件,如选项菜单,上下文菜单,子菜单等。它们被保存在res/menu/文件夹下,通过R.menu类访问
raw/任意的文件以它们的原始形式保存。需要根据名为R.raw.filename的资源ID,通过调用Resource.openRawResource()来打开raw文件
values/包含简单值(如字符串,整数,颜色等)的XML文件。这里有一些文件夹下的资源命名规范。arrays.xml代表数组资源,通过R.array类访问;integers.xml代表整数资源,通过R.integer类访问;bools.xml代表布尔值资源,通过R.bool类访问;colors.xml代表颜色资源,通过R.color类访问;dimens.xml代表维度值,通过R.dimen类访问;strings.xml代表字符串资源,通过R.string类访问;styles.xml代表样式资源,通过R.style类访问
xml/可以通过调用Resources.getXML()来在运行时读取任意的XML文件。可以在这里保存运行时使用的各种配置文件
minmap/保存应用的图标

简单的例子

配置资源

例如:将以下图片下载并命名为skyone.png

skyone

移动到res/drawable/文件夹下,在activity_main.xml中加入ImageView

<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="180dp"
android:contentDescription="@string/img_skyone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/skyone" />

res/values/strings.xml中加入:

<string name="img_skyone">Skyone</string>

连接手机,编译运行。

代码

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="180dp"
android:contentDescription="@string/img_skyone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/skyone" />

<Button
android:id="@+id/button"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="#FFFFFF"
android:onClick="onClickButton"
android:text="@string/button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imageView" />

</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity.java

package host.skyone.resource;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

public void onClickButton(View view) {
Toast.makeText(this, "欢迎访问Skyone哦!" , Toast.LENGTH_LONG).show();
}
}

strings.xml

<resources>
<string name="app_name">Resource</string>
<string name="img_skyone">Skyone</string>
<string name="button">点我~^_^~</string>
</resources>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="host.skyone.resource">

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Resource">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>

例图:

示例