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
相关产品推荐
相关产品推荐

