You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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编译时包含该目录的资源:

  1. 打开phone模块的模块级build.gradle文件(注意不是项目根目录的build.gradle)
  2. 在android代码块中添加资源目录配置:
    android {
        // 其他原有配置...
        sourceSets {
            main {
                res.srcDirs += 'tablet/res'
            }
        }
    }
    
  3. 点击Android Studio右上角的Sync Now同步项目
  4. 同步完成后,tablet/res中的资源会和phone/res的资源一起编译到phone模块的R类中,直接用R.layout.xxx(替换xxx为目标XML文件名)即可调用,无需额外导入其他R类。

方法二:将tablet设为库模块并添加依赖(适合tablet需要独立维护的场景)

如果tablet需要作为独立模块开发、后续可能复用,可按以下步骤操作:

  1. 将tablet设为库模块

    • 右键tablet目录 → 选择Open Module Settings(或按F4)
    • 在弹出窗口中,将模块类型修改为Android Library(默认可能是Application)
    • 点击Apply和OK保存配置
  2. 让phone模块依赖tablet模块

    • 打开phone模块的模块级build.gradle
    • 在dependencies代码块中添加依赖:
      dependencies {
          // 其他原有依赖...
          implementation project(':tablet')
      }
      
    • 点击Sync Now同步项目
  3. 访问资源

    • 同步完成后,tablet模块会生成独立的R类,在phone的Activity中导入tablet的R类(例如import com.yourpackage.tablet.R;,替换为tablet模块的实际包名)
    • 调用资源时使用tablet.R.layout.xxx,若phone和tablet存在同名资源,phone模块的资源会优先生效。

注意:若出现资源重名冲突,建议给tablet的资源添加专属前缀(如tablet_xxx.xml),避免编译报错。

内容的提问来源于stack exchange,提问作者Wenny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 19:15:51