【Android之路】图片无障碍化、文本易翻译初步和R类
图片无障碍化
在开发app的时候,需要主要到面向的用户群体中可能存在残障人士,而盲人使用app基本是靠听力的,这个时候就需要我们对图片进行注释,来让盲人听得到这是什么内容。
示例代码
Image(painter = image,contentDescription = null,contentScale = ContentScale.Crop,alpha = 0.5F)
在这里,contentDescription
就是所谓的注释,我们可以在这里插入字符串。
文本易翻译
如果我们直接在应用里面写死了很多硬文本,这样不仅会让后续的维护麻烦,还会让app国际化变得困难,这个时候就需要将硬文本提取出来。
实现步骤
首先,选中文本,然后点击如图所示的地方:
然后为我们的这个文本变量命名:
点击确定之后,我们就能在file name
对应的文件里面看见我们的文本:
这个时候,我们会发现代码自己发生了变化,如图所示:
GreetingImage(message = stringResource(stringResource(R.string.aaaa)), from = stringResource(R.string.author))
R类
在 Android 项目里说到的 R
,指的是 系统自动生成的一个资源索引类,全名是 com.example.yourapp.R
(在你的代码里看到的是 import android.R
或 import com.example.mylearningapplication.R
)。
1. R 是什么
- R 是一个自动生成的 Java/Kotlin 类,编译时由 Android Gradle 插件根据
res/
目录下的所有资源文件生成。 - 它把每个资源文件(布局、图片、字符串、颜色等)都转换成一个 整型常量 ID,方便在代码里引用。
位置:
app/build/generated/source/r/…/R.java
(或对应的 Kotlin stub)
2. R 的结构
R 类是一个大容器,里面按资源类型分成很多内部静态类,例如:
public final class R {public static final class layout {public static final int activity_main = 0x7f0a0000;}public static final class id {public static final int button_login = 0x7f0800af;}public static final class string {public static final int app_name = 0x7f0f0012;}public static final class color {public static final int primary = 0x7f06004d;}
}
R.layout.activity_main
→ 指向res/layout/activity_main.xml
R.id.button_login
→ 指向布局里的android:id="@+id/button_login"
R.string.app_name
→ 指向res/values/strings.xml
里的app_name
R.color.primary
→ 指向res/values/colors.xml
里的颜色
3. R 的来源有两种
-
com.example.xxx.R
(项目自己的 R)- 大部分情况要用自己的这个,表示你 app 下的资源。
- 例如:
setContentView(R.layout.activity_main)
、getString(R.string.app_name)
。
-
android.R
(系统 R)- 代表 Android 系统内置的资源,例如
android.R.layout.simple_list_item_1
、android.R.color.black
。 - 如果你的代码里不小心
import android.R
,就会导致写R.layout.xxx
时找不到自己项目里的资源。
- 代表 Android 系统内置的资源,例如
⚠️ 常见坑:
- Android Studio 有时会自动 import
android.R
,这样就无法访问自己定义的R.layout...
,要删掉import android.R
,只保留import com.example.xxx.R
。
4. R 与 Compose 的关系
-
在 Jetpack Compose 里,你不再需要通过
R.layout
去引用布局,但 图片、字符串、颜色、主题 还是通过R
。 -
例如:
Image(painter = painterResource(R.drawable.my_icon), contentDescription = null) stringResource(R.string.app_name)
✅ 总结
- R = 资源索引类,由编译器自动生成,把
res/
下的所有资源映射成常量 ID。 com.example.xxx.R
用来访问自己 app 的资源;android.R
是系统内置资源。- 在 Compose 中仍然用
R
来访问非布局资源。 - 如果遇到 “找不到布局/资源”的报错,先检查是不是被 IDE 自动导入了
android.R
。