【问题标题】:ButterKnife 8.0.1 @OnClick not working in Fragment - Android StudioButterKnife 8.0.1 @OnClick 在 Fragment 中不起作用 - Android Studio
【发布时间】:2017-07-05 13:27:35
【问题描述】:

我在我的 android studio 项目中使用 ButterKnife 8.0.1。下面是我的gradle文件和片段类的sn-p。我无法在按钮单击中看到 Toast 消息。但是如果我使用 onCLicklistener ,我可以看到 Toast。

请帮我找出我做错了什么我被卡住了

我的摇篮

apply plugin: 'com.android.application'


android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "tdd.serveroverload.com.tdd"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.android.support:design:23.4.0'
    compile 'com.android.support:support-v4:23.4.0'
    compile 'com.jakewharton:butterknife:8.0.1'
}

片段类

 @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);

        calcView.findViewById(R.id.add).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                 //It Works
                Toast.makeText(getActivity(), "Working", Toast.LENGTH_SHORT).show();
            }
        });

        unbinder = ButterKnife.bind(this, calcView);

        return calcView;
    }


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

         //It Does not Works
        if (view.getId() == R.id.one) {

            Toast.makeText(getActivity(), "Click", Toast.LENGTH_SHORT).show();
        }
        Toast.makeText(getActivity(), "Working", Toast.LENGTH_SHORT).show();
        result.setText(result.getText().toString() + 1);
    }

【问题讨论】:

  • 你看不到Clickworking toast 吗?

标签: android android-fragments android-studio butterknife


【解决方案1】:

来自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'
}

确保将 apply plugin ... 行放在文件顶部的某个位置。

【讨论】:

  • 谢谢我做到了,但现在我崩溃了原因:java.lang.RuntimeException:无法在 Butterknife.ButterKnife 绑定 tdd.serveroverload.com.tdd.ui.fragment.HomeFragment 的视图。在 tdd.serveroverload.com.tdd.ui.fragment.HomeFragment.onCreateView(HomeFragment.java:85) 处绑定(ButterKnife.java:189)。
  • 它解决了我所有的问题,感谢 MidasLefko 的帮助。
  • 我很高兴从 7.0.1 升级到 8.0.1 时遇到了同样的问题
【解决方案2】:

在片段视图上绑定点击事件:

您只需要添加注释。无需使用视图检查 id。

请更新您的代码如下:

 @OnClick(R.id.one)
    public void one() {
        Toast.makeText(getActivity(), "Click", Toast.LENGTH_SHORT).show();
        Toast.makeText(getActivity(), "Working", Toast.LENGTH_SHORT).show();
        result.setText(result.getText().toString() + 1);
    }

这是来自以下演示的示例代码:

    /**
     * Attempts to call below method when 'Fragment Binding Button' get clicked.
     */
    @OnClick(R.id.btn_fragment_binding)
    void OnFragmentBindingClicked() {
        loadSampleFragment();
    }

有关更多信息和不同的绑定,请查看以下演示:

https://github.com/mamatagelanee07/ButterKnifeDemo

【讨论】:

  • 我知道添加 id 是可选的,但没有它就无法工作,所以我开始尝试使用 id,你可以看到我添加的第二个 toast。
【解决方案3】:
App Level(build.gradle)

apply plugin: 'android-apt'
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:24.2.1'
    testCompile 'junit:junit:4.12'
    compile 'com.jakewharton:butterknife:8.4.0'
    apt 'com.jakewharton:butterknife-compiler:8.4.0'
}


Project Level(build.gradle)

buildscript {
    repositories {
        jcenter()
    }
    dependencies {

        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

    }
}

【讨论】:

    【解决方案4】:

    同一网站https://github.com/JakeWharton/butterknife#download 请在下面添加相同的内容

    dependencies {
      compile 'com.jakewharton:butterknife:8.6.0'
      annotationProcessor 'com.jakewharton:butterknife-compiler:8.6.0'
    }
    

    【讨论】:

      猜你喜欢
      • 2016-08-29
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      相关资源
      最近更新 更多