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

布局资源新增子文件夹后ButterKnife @BindView抛出AnnotationTypeMismatchException

解决方案

问题根因

Android原生res/layout目录默认不支持嵌套子文件夹,你手动添加子文件夹并修改gradle资源目录配置后,ButterKnife的注解处理器无法正确识别拆分后的资源索引,导致读取R.id.xxx值时类型不匹配。

可行解决步骤

  • 方案1:修正资源目录配置+清理重建
    首先确认你module下build.gradle的资源目录配置符合规范,需要把根res目录放在配置列表末尾,示例:

    android {
        sourceSets {
            main {
                res.srcDirs = [
                    'src/main/res/layout/home',
                    'src/main/res/layout/mine',
                    'src/main/res/layout/setting',
                    'src/main/res' // 根res必须放在配置列表最后
                ]
            }
        }
    }
    

    配置完成后清理全局构建缓存重新编译:执行命令 ./gradlew clean assembleDebug 或者点击Android Studio的 Build -> Clean Project 再执行 Rebuild Project。

  • 方案2:适配非final R类场景
    如果你是在Library模块中使用ButterKnife,或者主模块开启了android.nonFinalResIds=true配置(AGP 7.0+部分场景默认开启),需要引入ButterKnife的gradle插件解决R类非final问题:

    1. 项目根目录build.gradle引入插件依赖,版本和你当前使用的ButterKnife版本保持一致:
    dependencies {
        classpath 'com.jakewharton:butterknife-gradle-plugin:10.2.3'
    }
    
    1. 在对应module的build.gradle头部应用插件:
    apply plugin: 'com.jakewharton.butterknife'
    
    1. 把代码中所有@BindView(R.id.xxx)替换为@BindView(R2.id.xxx),R2是ButterKnife插件自动生成的final类型资源索引类。
  • 方案3:替换实现方案
    如果上述方案都不生效,可临时移除layout子文件夹恢复原有结构验证问题是否消失,或者迁移使用Jetpack的ViewBinding替代ButterKnife,ViewBinding原生支持多资源目录配置,不需要额外适配。

注意:不推荐在layout下过度嵌套子文件夹,目前Android官方对资源目录嵌套的支持度有限,后续升级AGP大概率会出现兼容问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 05:15:03