Android应用中如何从子目录的./res/文件夹获取资源?
Android跨目录访问资源问题解决方法
你的项目目录结构如下:
phone ├── res ├── src └── tablet ├── res └── src
当前phone/src下的Activity需要访问tablet/res中的XML资源,但尝试导入.phone.R和phone.tablet.R时找不到后者,原因是Android的资源编译机制并非按普通目录结构生成R类,可按以下两种方式处理:
方法一:将tablet目录设为额外资源目录(适合tablet是phone子目录的场景)
如果tablet只是phone模块下的子目录,无需独立维护,可直接配置让Android编译时包含该目录的资源:
- 打开phone模块的模块级build.gradle文件(注意不是项目根目录的build.gradle)
- 在
android代码块中添加资源目录配置:android { // 其他原有配置... sourceSets { main { res.srcDirs += 'tablet/res' } } } - 点击Android Studio右上角的
Sync Now同步项目 - 同步完成后,
tablet/res中的资源会和phone/res的资源一起编译到phone模块的R类中,直接用R.layout.xxx(替换xxx为目标XML文件名)即可调用,无需额外导入其他R类。
方法二:将tablet设为库模块并添加依赖(适合tablet需要独立维护的场景)
如果tablet需要作为独立模块开发、后续可能复用,可按以下步骤操作:
将tablet设为库模块
- 右键
tablet目录 → 选择Open Module Settings(或按F4) - 在弹出窗口中,将模块类型修改为
Android Library(默认可能是Application) - 点击
Apply和OK保存配置
- 右键
让phone模块依赖tablet模块
- 打开phone模块的模块级build.gradle
- 在
dependencies代码块中添加依赖:dependencies { // 其他原有依赖... implementation project(':tablet') } - 点击
Sync Now同步项目
访问资源
- 同步完成后,tablet模块会生成独立的R类,在phone的Activity中导入tablet的R类(例如
import com.yourpackage.tablet.R;,替换为tablet模块的实际包名) - 调用资源时使用
tablet.R.layout.xxx,若phone和tablet存在同名资源,phone模块的资源会优先生效。
- 同步完成后,tablet模块会生成独立的R类,在phone的Activity中导入tablet的R类(例如
注意:若出现资源重名冲突,建议给tablet的资源添加专属前缀(如tablet_xxx.xml),避免编译报错。
内容的提问来源于stack exchange,提问作者Wenny
相关产品推荐
相关产品推荐

