res\values\attrs.xml: Error: Found item Attr/text more than one time 编译报错解决方案

本文介绍了解决自定义控件中属性重复定义的问题,通过将公共属性抽取到一个通用的declare-styleable标签中,避免了多次定义相同属性的错误,简化了代码并提高了效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在做自定义控件的时候定义自定义属性遇到一个问题,自定义属性重复编译报错了,我是这么写的,

    <declare-styleable name="TextButtonView">
        <attr name="text" format="string"/>
        <attr name="textSize" format="dimension"/>
        <attr name="textColor" format="color"/>
        <attr name="background" format="reference"/>
    </declare-styleable>
    <declare-styleable name="CountdownView">
        <attr name="countdownstate" format="boolean" />
        <attr name="text" format="string"/>
        <attr name="countTextSize" format="dimension"/>
        <attr name="countTextColor" format="color"/>
        <attr name="countBackground" format="reference"/>
    </declare-styleable>

解决办法是将相同的属性定义到declare-styleable标签外面,这样就可以重复使用了,这样写可以解决问题

    <attr name="text" format="string"/>
    <declare-styleable name="TextButtonView">
        <attr name="text" />
        <attr name="textSize" format="dimension"/>
        <attr name="textColor" format="color"/>
        <attr name="background" format="reference"/>
    </declare-styleable>
    <declare-styleable name="CountdownView">
        <attr name="countdownstate" format="boolean" />
        <attr name="text" />
        <attr name="countTextSize" format="dimension"/>
        <attr name="countTextColor" format="color"/>
        <attr name="countBackground" format="reference"/>
    </declare-styleable>

网上也有很多这么写的,既然抽出公共的属性可行,那么为什么在一个项目中不定义一个标签,把我们的自定义属性写在一个标签里面呢

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="CustomeAttrs">
        <attr name="text" format="string"/>
        <attr name="countdownstate" format="boolean" />
        <attr name="textSize" format="dimension"/>
        <attr name="textColor" format="color"/>
        <attr name="background" format="reference"/>
    </declare-styleable>

    <!--<declare-styleable name="TextButtonView">-->
        <!--<attr name="text" />-->
        <!--<attr name="textSize" format="dimension"/>-->
        <!--<attr name="textColor" format="color"/>-->
        <!--<attr name="background" format="reference"/>-->
    <!--</declare-styleable>-->
    <!--<declare-styleable name="CountdownView">-->
        <!--<attr name="countdownstate" format="boolean" />-->
        <!--<attr name="text" />-->
        <!--<attr name="countTextSize" format="dimension"/>-->
        <!--<attr name="countTextColor" format="color"/>-->
        <!--<attr name="countBackground" format="reference"/>-->
    <!--</declare-styleable>-->
</resources>

像这样验证过写是可行,写一次属性就可以了,不用重新定义多次,简单省事 !!!

<think>我们注意到用户的问题是在构建Android项目时遇到了资源链接失败的问题,具体错误信息涉及QMUI库相关的资源找不到(如style/QMUI.Compat.NoActionBar, attr/QMUITopBarStyle, color/qmui_config_color_white等)。同时,用户之前的问题是关于添加ButterKnife,但根据引用[1]中的错误信息,这似乎是一个Flutter项目(路径中有Flutter Projects),但错误是Android资源链接失败,可能是Flutter项目中的Android模块(如插件或原生代码)出现了问题。 然而,用户最后的问题描述是Android项目(非Flutter)中QMUI资源找不到,可能是在添加ButterKnife后出现的。因此,我们重点解决Android项目(非Flutter)中QMUI资源链接失败的问题。 问题分析: 1. 错误信息中提到的资源(如QMUI.Compat.NoActionBar, QMUITopBarStyle, qmui_config_color_white)都属于QMUI库。 2. 出现这些错误的原因可能是: a) QMUI库没有正确添加到项目中。 b) 项目依赖的QMUI库版本与当前使用的Android Gradle插件版本或编译版本不兼容。 c) 资源冲突导致QMUI资源被其他库覆盖或丢失。 d) 项目使用了不正确的主题或样式。 解决方案: 步骤1:确保QMUI库已正确添加 在app/build.gradle文件中,检查是否添加了QMUI库的依赖。例如: ```groovy dependencies { // QMUI库 implementation 'com.qmuiteam:qmui:2.0.0' // 请使用最新版本,比如2.0.0或更高 } ``` 步骤2:检查QMUI库的版本兼容性 确保使用的QMUI库版本与项目的compileSdkVersion和targetSdkVersion兼容。可以查看QMUI库的官方文档或GitHub仓库获取版本要求。 步骤3:清理和重建项目 在Android Studio中,执行以下操作: - 选择菜单栏的 "Build" -> "Clean Project" - 然后选择 "Build" -> "Rebuild Project" 步骤4:检查资源冲突 如果项目中多个依赖库有相同的资源名称,可能会导致资源被覆盖。可以尝试在build.gradle文件中添加资源前缀(但注意,这只能解决应用程序模块的资源,不能解决库模块): ```groovy android { resourcePrefix "qmui_" // 为应用程序模块的资源添加前缀,避免与库模块冲突(但QMUI库内部资源已经带有qmui前缀,所以这里主要是防止其他库使用了相同的资源名) } ``` 步骤5:检查主题和样式 在res/values/styles.xml文件中,检查是否使用了正确的主题。例如: ```xml <style name="AppTheme" parent="QMUI.Compat.NoActionBar"> <!-- 其他属性 --> </style> ``` 如果这里使用了QMUI的主题,那么必须确保QMUI库已经被正确添加。 步骤6:检查依赖传递冲突 如果项目中同时存在ButterKnife和QMUI,并且它们依赖了不同版本的support库或androidx库,可能会导致资源链接失败。可以通过以下方式查看依赖树并解决冲突: - 在终端运行:`./gradlew app:dependencies`(Windows使用`gradlew app:dependencies`) - 查看是否有多个版本的support库或androidx库,如果有,可以强制使用统一版本。 例如,在app/build.gradle文件中添加: ```groovy configurations.all { resolutionStrategy { // 强制使用特定版本的support库(如果使用的是androidx,则替换为对应的androidx库) // 注意:根据实际情况替换版本号 force 'com.android.support:appcompat-v7:28.0.0' force 'com.android.support:support-v4:28.0.0' // ... 其他冲突的库 } } ``` 但是,如果项目已经迁移到androidx,则QMUI库也应该使用支持androidx的版本(如1.4.0以上版本)。在QMUI的GitHub上,1.4.0版本开始支持androidx。 步骤7:如果使用androidx,确保QMUI库版本支持androidx 在QMUI的GitHub发布页上,1.4.0及以上版本支持androidx。因此,请使用: ```groovy implementation 'com.qmuiteam:qmui:2.0.0' // 2.0.0版本支持androidx ``` 步骤8:检查是否开启了AndroidX 在gradle.properties文件中,确保有以下配置: ```properties android.useAndroidX=true android.enableJetifier=true ``` 步骤9:如果问题仍然存在,尝试升级Android Gradle插件版本和Gradle版本 在项目根目录的build.gradle文件中,检查classpath的Android Gradle插件版本,确保是比较新的版本(如3.6.0以上)。 步骤10:如果以上步骤都无法解决,可能是QMUI库本身的问题,可以尝试在GitHub上搜索相关问题,或者考虑使用其他UI库。 由于用户的问题描述中同时出现了ButterKnife和QMUI,我们还需要注意ButterKnife是否与QMUI存在冲突。ButterKnife本身只是一个视图绑定库,通常不会影响资源,但ButterKnife依赖的support库版本可能与QMUI依赖的版本不一致,从而引起冲突。因此,步骤6中的依赖统一非常重要。 最后,如果用户是在Flutter项目中遇到这个问题(根据引用[1]的路径),那么应该检查Flutter项目中android/app/build.gradle文件,确保QMUI库被正确添加,并且执行上述的依赖冲突解决步骤。 注意:由于引用[1]中的错误信息出现在Flutter项目路径下,但用户当前问题描述是Android项目,我们以用户当前问题(QMUI资源找不到)为准,提供解决方案。 如果用户确认是Flutter项目中的Android模块出现问题,那么解决方案相同,但需要修改Flutter项目中的android/app/build.gradle文件。 生成的相关问题: §§相关问题§§ 1. 如何解决QMUI库在Android项目中的资源链接失败问题? 2.Android项目中如何正确添加QMUI库依赖? 3. 如何解决Android项目中的资源冲突? 4. 如何升级QMUI库到最新版本? 5. 在Flutter项目中如何解决Android资源链接失败的问题?</think>### 解决 Android 资源链接失败问题(QMUI 资源缺失) 根据您遇到的资源链接错误,以下是完整的解决方案: #### 1. **检查 QMUI 依赖配置** 在 `app/build.gradle` 中添加最新版 QMUI 依赖: ```gradle dependencies { // 确保使用最新版 QMUI implementation 'com.qmuiteam:qmui:2.1.0' implementation 'com.qmuiteam:qmui-arch:2.1.0' // ButterKnife 依赖 (与 QMUI 兼容) implementation 'com.jakewharton:butterknife:10.2.3' annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3' } ``` #### 2. **解决资源冲突** 在 `gradle.properties` 中添加配置: ```properties # 强制使用 AndroidX 并启用资源合并 android.useAndroidX=true android.enableJetifier=true android.enableResourceOptimizations=true ``` #### 3. **检查主题配置** 在 `styles.xml` 中修正主题引用: ```xml <!-- 使用正确的主题继承链 --> <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- 确保不使用不存在的 QMUI 主题 --> <!-- 错误示例: parent="QMUI.Compat.NoActionBar" --> <!-- 正确引用 QMUI 属性 --> <item name="QMUITopBarStyle">@style/MyTopBarStyle</item> </style> ``` #### 4. **资源前缀冲突解决方案** 在 `app/build.gradle` 中添加资源前缀: ```gradle android { // 防止资源命名冲突 resourcePrefix "qmui_" // 必须启用 dataBinding buildFeatures { dataBinding true viewBinding true } } ``` #### 5. **清理构建缓存** 执行以下终端命令: ```bash # 清理构建缓存 ./gradlew cleanBuildCache # 重新生成资源 ./gradlew clean ./gradlew :app:mergeDebugResources --stacktrace ``` #### 6. **检查依赖冲突** 在终端运行依赖检查: ```bash ./gradlew :app:dependencies --configuration debugRuntimeClasspath ``` 查看输出中是否有多个版本的 support 库或 androidx 库冲突,如有则添加排除规则: ```gradle implementation ('com.qmuiteam:qmui:2.1.0') { exclude group: 'com.android.support', module: 'support-compat' } ``` #### 7. **验证资源存在性** 检查 QMUI 资源是否实际包含在库中: 1. 打开项目视图:`Project > External Libraries > QMUI` 2. 验证路径:`/res/values/colors.xml` 中应包含 `qmui_config_color_white` 3. 验证路径:`/res/values/attrs.xml` 中应包含 `QMUITopBarStyle` #### 8. **替代方案(若问题持续)** 如果仍无法解决,考虑迁移到官方视图绑定: ```gradle android { buildFeatures { viewBinding true } } ``` 在 Activity 中使用: ```java // 替代 ButterKnife private ActivityMainBinding binding; protected void onCreate(Bundle savedInstanceState) { binding = ActivityMainBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); binding.textView.setText("Hello ViewBinding!"); } ``` > **关键提示**:QMUI 2.0+ 需要 AndroidX[^3],请确保项目已完成 AndroidX 迁移。如果从旧项目升级,执行 `Refactor > Migrate to AndroidX` 并检查所有 XML 文件中的资源引用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mrsongs的心情杂货铺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值