【问题标题】:java.lang.illegalStateException: Butterknifejava.lang.illegalStateException:黄油刀
【发布时间】:2020-09-27 18:24:30
【问题描述】:

我正在使用黄油刀绑定我的视图,所以当活动开始时,会引发以下异常

java.lang.RuntimeException:无法启动活动 ComponentInfo{..package name...}:java.lang.IllegalStateException:字段“tabItem”和方法“check”的 ID 为 2131558524 的必需视图“l”不是成立。如果此视图是可选的,请添加“@Nullable”(字段)或“@Optional”(方法)注释。

注意:我在 setContentView(view) 之后调用了 Butterknife.bind(this),这个视图不是可选的

我的代码

public class HandlingActivity extends AppCompatActivity {

@BindView(R.id.container_view)FrameLayout container;
@BindView(R.id.l)TabItem tabItem;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_handling);
    ButterKnife.bind(this);
}

@OnClick(R.id.l)void check(){
    StoriesFragment storiesFragment = new StoriesFragment();
    getSupportFragmentManager().beginTransaction().replace(R.id.container_view,storiesFragment).commit();
     }
}

【问题讨论】:

  • 你确定你的 id 被声明了吗?
  • @ste9206 是的,我已经使缓存失效并重新启动了android studio。
  • 您的 TabItem 在哪里?它在根吗?在视图中使用 nullable 或 optional 似乎不正确,您可能会得到 NullPointerException

标签: android illegalstateexception butterknife


【解决方案1】:

如果您的 TabItem 尚未准备好,则有可能,因此请尝试在声明变量及其相应的 onclick 时使用它。

引用自here

 @Nullable
 @BindView(R.id.l)TabItem tabItem;

 @Optional
 @OnClick(R.id.l)
  void check(){
     //method logic...
  }

【讨论】:

  • 它有效!!,为什么我们需要添加这个,因为项目不能为 Nullable 或 Optional?
  • 很高兴为您提供帮助,如果这解决了问题,请接受它作为答案,关于您的问题,请查看this 以了解@Nullable@Optional 用例..
【解决方案2】:

在我的情况下,这个错误是因为我为不同的版本使用了两种布局:

  • activity_login.xml

  • activity_login.xml (v21)

我在 activity_login.xml 中添加了一个 progressBar 但是...

我忘记添加到 activity_login.xml (v21)

【讨论】:

    【解决方案3】:

    我遇到了类似的错误,这是由于错误的布局文件在视图上被夸大了,而该视图没有错误报告的相关字段。

    【讨论】:

    • 遇到同样的问题,谢谢。
    【解决方案4】:
    1. 检查你是否输入了build.gradle (module:app)

      dependencies {
      annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
      provided 'javax.annotation:jsr250-api:1.0'
      compile 'com.jakewharton:butterknife:8.5.1'
      
      }
      
    2. 检查您的 id 是否存在

    3. 尝试添加@OnClick(R.id.l)void check(View v){ ... }

    【讨论】:

      【解决方案5】:

      在我的 Activity 类中将注释 @Optional 添加到 @Onclick 后,它对我有用:

      @Optional
      @OnClick({R.id.your_id_1, R.id.your_id_2})
      public void onClick(View v) {
          switch (v.getId()) {
              case R.id.your_id_1:
                  break;
              case R.id.your_id_2:
                  break;
          }
      }
      

      导入依赖并绑定你的Activity:

      import butterknife.ButterKnife;
      import butterknife.OnClick;
      import butterknife.Optional;
      
      public class YourActivity extends AppCompatActivity {
      
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.your_layout);
              ButterKnife.bind(this);
          }
      }
      

      要在库中使用 Butter Knife,请将插件添加到您的构建脚本中:

      buildscript {
        repositories {
          mavenCentral()
         }
        dependencies {
          classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1'
        }
      }
      

      到你的 app/build.gradle

      android {
          compileSdkVersion 27
          buildToolsVersion '27.0.3'
          defaultConfig {
              applicationId 'your_app_id'
              minSdkVersion 16
              targetSdkVersion 27
              versionCode 1
              versionName "1.0"
      
          }
      }
      
      dependencies {
              implementation 'com.jakewharton:butterknife:8.8.1'
              annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
      }
      

      干杯;]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-30
        • 2019-03-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多