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

Android中@BindView报“Attribute value must be constant”错误求助

ButterKnife绑定出现“Attribute value must be constant”错误的解决方法

问题概述

开发Android外卖配送APP时,使用ButterKnife的@BindView注解绑定控件,出现**“Attribute value must be constant”**错误,涉及R.id.recycler_products、R.id.mainLayout、R.id.badge三个控件ID。核对教程代码、尝试定义静态常量绑定均未解决问题。

相关代码

XML布局文件(activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/mainLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <LinearLayout
        android:id="@+id/panel"
        android:orientation="horizontal"
        android:weightSum="16"
        android:background="#F7CF9C"
        android:layout_width="match_parent"
        android:layout_height="?android:attr/actionBarSize">

        <ImageView
            android:src="@drawable/baseline_arrow_back_ios_new_24"
            android:layout_gravity="start|center_vertical"
            android:layout_width="0dp"
            android:layout_weight="2"
            android:layout_height="wrap_content"/>

        <TextView
            android:id="@+id/txtPrice"
            android:layout_weight="11"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:text="@string/products"
            android:textSize="40sp"
            android:textStyle="bold"
            android:gravity="center"
            android:fontFamily="@font/abraham"
            android:textColor="#000000" />
        
        <FrameLayout
            android:id="@+id/btncart"
            android:layout_width="0dp"
            android:layout_weight="3"
            android:layout_height="match_parent">

            <ImageView
                android:id="@+id/cartButton"
                android:src="@drawable/baseline_shopping_cart_checkout_24"
                android:layout_gravity="center_vertical"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>

            <com.nex3z.notificationbadge.NotificationBadge
                android:id="@+id/badge"
                android:layout_width="30dp"
                android:layout_height="30dp"
                android:layout_ToRightOf="@id/cartButton"
                android:layout_alignTop="@id/cartButton"
                android:layout_marginLeft="10dp"
                app:nbMaxTextLength="2" />
        </FrameLayout>
    </LinearLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_products"
        android:padding="8dp"
        android:layout_below="@+id/panel"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

</RelativeLayout>

MainActivity.java代码

package com.example.carttest;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.widget.RelativeLayout;

import com.nex3z.notificationbadge.NotificationBadge;

import butterknife.BindView;
import butterknife.ButterKnife;

public class MainActivity extends AppCompatActivity {
    @BindView(R.id.recycler_products)
    RecyclerView recyclerProducts;
    @BindView(R.id.mainLayout)
    RelativeLayout mainLayout;
    @BindView(R.id.badge)
    NotificationBadge badge;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
    }
}

尝试过的修改(无效)

private static final int RECYCLER_VIEW_ID = R.id.recycler_products;
private static final int MAIN_LAYOUT_ID = R.id.mainLayout;
private static final int BADGE_ID = R.id.badge;

解决方法

1. 强制生成Final类型的资源ID

Android Gradle Plugin 3.0+默认生成非Final的R类,而ButterKnife要求注解参数为编译时常量。在项目根目录的gradle.properties中添加以下配置:

android.nonFinalResIds=false

2. 确认ButterKnife依赖配置正确

  • 项目根目录build.gradle(Project级)添加插件依赖:
    buildscript {
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath 'com.jakewharton:butterknife-gradle-plugin:10.2.3'
        }
    }
    
  • App模块build.gradle添加依赖并应用插件:
    apply plugin: 'com.jakewharton.butterknife'
    
    dependencies {
        implementation 'com.jakewharton:butterknife:10.2.3'
        annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3'
    }
    

3. 清理并重建项目

执行Build -> Clean Project,再执行Build -> Rebuild Project,确保R文件重新生成。

4. 检查R类导入

确保Activity中导入的是项目自身的R类,删除import android.R;(如果存在),替换为:

import com.example.carttest.R;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:06:02