13

我有一个片段,我正在使用 Butterknife。

public class FooFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.foo, container, false);

        ButterKnife.inject(this, view);

        return view;
    }

    @OnClick(R.id.some_btn)
    public void someButtonOnClick() {
        // do something
    }
}

但是,当在屏幕上点击按钮时,永远不会调用 someButtonOnClick 方法。

关于我在 Butterknife 框架上做错了什么的想法?

这是正在使用的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@color/White">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/some_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_margin="@dimen/xsmall_margin"
            android:background="@drawable/some_btn_selection" />

        <Button
            android:id="@+id/some_other_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_margin="@dimen/xsmall_margin"
            android:background="@drawable/some_other_btn_selection" />
    </LinearLayout>
</LinearLayout>
4

4 回答 4

19

对于最新的 ButterKnife 8.0.1 June -2016

InjectViewinject已替换为BindViewandbind 这是要遵循的步骤:-

否决票不接受来自 Butterknife github 页面:

将此添加到您的项目级 build.gradle

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

将此添加到您的模块级 build.gradle

apply plugin: 'android-apt'

android {
  ...
}

dependencies {
  compile 'com.jakewharton:butterknife:8.0.1'
  apt 'com.jakewharton:butterknife-compiler:8.0.1'
}

然后像这样使用Butterknife

 private Unbinder unbinder;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View calcView = inflater.inflate(R.layout.content_main, container, false);

        unbinder = ButterKnife.bind(this, calcView);

        return calcView;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        unbinder.unbind();
    }


    @OnClick(R.id.one)
    public void one() {

        Toast.makeText(getActivity(), "Working", Toast.LENGTH_SHORT).show();
        result.setText(result.getText().toString() + 1);
    }
于 2016-06-07T07:57:31.403 回答
4

只需使用此结构:

@OnClick(R.id.some_btn)
public void someButtonOnClick(View view) {
    // do something
}

这在这里描述http://developer.android.com/reference/android/R.attr.html#onClick

于 2015-02-02T20:35:23.790 回答
3

这对我有用:

@Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_home, container, false);
    ButterKnife.bind(getActivity(), view);
    return view;
}
于 2017-02-26T21:52:37.640 回答
0

如果您仍然有问题。清理项目并尝试运行。它应该修复。如果您仍然有问题,请调用someButtonOnClick()onCreate运行并删除它并再次运行它。它应该工作。它对我有用。

于 2014-07-02T14:39:05.180 回答