【问题标题】:@OnClick is not working in implementation of ButterKnife Library@OnClick 在 ButterKnife Library 的实现中不起作用
【发布时间】:2015-01-03 12:23:21
【问题描述】:

@OnClick 在 ButterKnife 库的实现中不起作用

当我点击Button 时,什么都没有发生。

这是我的完整代码:

public class MainActivity extends ActionBarActivity {
    @InjectView(R.id.edit_user)
    EditText username;
    @InjectView(R.id.edit_pass)
    EditText password;

    @OnClick(R.id.btn)
    void submit() {
        // TODO call server...
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.inject(this);
        // TODO Use "injected" views...
    }
}

这是我的 xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<EditText
    android:id="@+id/edit_user"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:hint="user" />

<EditText
    android:id="@+id/edit_pass"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:hint="user" />

<Button
    android:id="@+id/btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Button" />

谢谢

【问题讨论】:

  • 你打电话给ButterKnife.inject(this, view);还是ButterKnife.inject(this);?
  • ButterKnife.inject(this);
  • @shayanpourvatan 必须将 ButterKnife.inject(this) 更改为 ButterKnife.inject(this, view)??
  • 你从activity或fragment调用这个?如果你从活动this调用就足够了,但如果你在片段或适配器中,你也必须传递你的view
  • 我用的是Activity,有什么要求开启注解吗?

标签: android butterknife


【解决方案1】:

对于在 Android Studio 中遇到此问题的任何人,请确保在各自的构建文件中包含必要的依赖项和 apt 插件(查看 Butterknife 自述文件)。我匆匆浏览了文档,只包含了编译依赖,这导致绑定无声地失败。

【讨论】:

【解决方案2】:

如 Butterknife 文档中所述,如果您使用 Eclipse,则需要在处理注释之前configure IDE

【讨论】:

    【解决方案3】:

    在你的活动中尝试添加..

     ButterKnife.inject(this);
    

    检查此代码

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.inject(this);
    }
    
    @OnClick(R.id.buttonAlert)
    public void alertClicked(View v){
    new AlertDialog.Builder(v.getContext())
        .setMessage(getFormattedMessge())
        .setNeutralButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
            }
        })
        .show();
     }
    

    【讨论】:

    • .inject 已更改为最新库中的 .bind
    【解决方案4】:

    仔细检查项目中的所有依赖项。这是自述文件中的下载说明。 配置您的项目级 build.gradle 以包含“android-apt”插件:

    buildscript {
       repositories {
          mavenCentral()
       }
       dependencies {
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
       }
    }
    

    然后,在模块级 build.gradle 中应用“android-apt”插件并添加 Butter Knife 依赖项:

    apply plugin: 'android-apt'
    
    android {
      ...
    }
    
    dependencies {
      compile 'com.jakewharton:butterknife:8.2.1'
      apt 'com.jakewharton:butterknife-compiler:8.2.1'
    }
    

    注意:如果您使用的是 2.2.0 或更高版本的新 Jack 编译器,则不需要 'android-apt' 插件,并且可以在声明编译器依赖项时将 apt 替换为 annotationProcessor。

    【讨论】:

      【解决方案5】:

      在 Activity 的 onCreate() 中使用 ButterKnife.bind(this);。或片段的 onCreateView。

      @OnClick(R.id.button_stop_sticky)
          public void onStopClicked(View v) {
      
              Toast.makeText(this, "onStop Clicked", Toast.LENGTH_LONG).show();
      
          }
      

      显然,app module > gradle 添加依赖

      compile 'com.jakewharton:butterknife:8.8.1'
      annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
      

      【讨论】:

        【解决方案6】:

        使用黄油刀你也可以像这样绑定你的视图......

         class ExampleActivity extends Activity {
        
            @Bind(R.id.title)
            TextView title;
            @Bind(R.id.subtitle)
            TextView subtitle;
            @Bind(R.id.footer)
            TextView footer;
        
            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.simple_activity);
                ButterKnife.bind(this);
                // TODO Use fields...
            }
        }
        

        更多详情可以看这个链接http://jakewharton.github.io/butterknife/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-10-05
          • 1970-01-01
          • 1970-01-01
          • 2015-06-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多