Why do I have problems whith 'com.jakewharton:butterknife:7.0.1' in Android Studio 3.0?

匿名 (未验证) 提交于 2019-12-03 09:14:57

问题:

I have the following problem when I run the 'app' (Android studio emulator):

Error:Execution failed for task ':app:javaPreCompileDebug'. > Annotation processors must be explicitly declared now.  The following dependencies on the compile classpath are found to contain annotation processor.  Please add them to the annotationProcessor configuration.     - butterknife-7.0.1.jar (com.jakewharton:butterknife:7.0.1)   Alternatively, set android.defaultConfig.javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true to continue with previous behavior.  Note that this option is deprecated and will be removed in the future.   See https://developer.android.com/r/tools/annotation-processor-error-message.html for more details. 

My Graddle-App Level:

apply plugin: 'com.android.application'  android {     compileSdkVersion 25     buildToolsVersion '26.0.2'      defaultConfig {         applicationId "com.hhhhh.android"         minSdkVersion 15         targetSdkVersion 25         versionCode 1         versionName "1.0"     }     buildTypes {         release {             minifyEnabled false             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'         }     } }  dependencies {      implementation 'com.google.firebase:firebase-database:11.0.4'     implementation 'com.google.firebase:firebase-auth:11.0.4'     compile fileTree(include: ['*.jar'], dir: 'libs')     compile 'com.android.support:appcompat-v7:25.2.0'     compile 'com.android.support:design:25.0.1'     compile 'com.jakewharton:butterknife:7.0.1'  }  apply plugin: 'com.google.gms.google-services' 

The error disappears when I switch to the version:

compile 'com.jakewharton:butterknife:8.7.0' 

But it generates more problems in my LogginActivity:

package com.sourcey.materiallogindemo;  import android.app.ProgressDialog; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log;  import android.content.Intent; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast;  import butterknife.ButterKnife; import butterknife.Bind;  public class LoginActivity extends AppCompatActivity {     private static final String TAG = "LoginActivity";     private static final int REQUEST_SIGNUP = 0;      @Bind(R.id.input_email) EditText _emailText;     @Bind(R.id.input_password) EditText _passwordText;     @Bind(R.id.btn_login) Button _loginButton;     @Bind(R.id.link_signup) TextView _signupLink;      @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_login);         ButterKnife.bind(this);          _loginButton.setOnClickListener(new View.OnClickListener() {              @Override             public void onClick(View v) {                 login();             }         });          _signupLink.setOnClickListener(new View.OnClickListener() {              @Override             public void onClick(View v) {                 // Start the Signup activity                 Intent intent = new Intent(getApplicationContext(), SignupActivity.class);                 startActivityForResult(intent, REQUEST_SIGNUP);                 finish();                 overridePendingTransition(R.anim.push_left_in, R.anim.push_left_out);             }         });     }      public void login() {         Log.d(TAG, "Login");          if (!validate()) {             onLoginFailed();             return;         }          _loginButton.setEnabled(false);          final ProgressDialog progressDialog = new ProgressDialog(LoginActivity.this,                 R.style.AppTheme_Dark_Dialog);         progressDialog.setIndeterminate(true);         progressDialog.setMessage("Authenticating...");         progressDialog.show();          String email = _emailText.getText().toString();         String password = _passwordText.getText().toString();          // TODO: Implement your own authentication logic here.          new android.os.Handler().postDelayed(                 new Runnable() {                     public void run() {                         // On complete call either onLoginSuccess or onLoginFailed                         onLoginSuccess();                         // onLoginFailed();                         progressDialog.dismiss();                     }                 }, 3000);     }       @Override     protected void onActivityResult(int requestCode, int resultCode, Intent data) {         if (requestCode == REQUEST_SIGNUP) {             if (resultCode == RESULT_OK) {                  // TODO: Implement successful signup logic here                 // By default we just finish the Activity and log them in automatically                 this.finish();             }         }     }      @Override     public void onBackPressed() {         // Disable going back to the MainActivity         moveTaskToBack(true);     }      public void onLoginSuccess() {         _loginButton.setEnabled(true);         finish();     }      public void onLoginFailed() {         Toast.makeText(getBaseContext(), "Login failed", Toast.LENGTH_LONG).show();          _loginButton.setEnabled(true);     }      public boolean validate() {         boolean valid = true;          String email = _emailText.getText().toString();         String password = _passwordText.getText().toString();          if (email.isEmpty() || !android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()) {             _emailText.setError("enter a valid email address");             valid = false;         } else {             _emailText.setError(null);         }          if (password.isEmpty() || password.length() < 4 || password.length() > 10) {             _passwordText.setError("between 4 and 10 alphanumeric characters");             valid = false;         } else {             _passwordText.setError(null);         }          return valid;     } } 

With 8.7.0:

回答1:

Annotation processors must be explicitly declared now

Do what it says

Add the second line

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

With 8.7.0 ... it generates more problems in my LogginActivity:

You are importing the wrong class...

Annotate fields with @BindView

That changed at Version 8.0

See the website for usage and the latest version. http://jakewharton.github.io/butterknife/

import butterknife.BindView;  ..  @BindView(R.id...) 


回答2:

you can solve this issue by simply adding this to your app level gradle file

android{ ....     defaultConfig{ ....     javaCompileOptions {         annotationProcessorOptions {             includeCompileClasspath true         }     } } 

Hope its worked



回答3:

Just add this line:

annotationProcessor 'com.jakewharton:butterknife-compiler:7.0.1' 

in your dependencies like:

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

Check this out for more details.



回答4:

You can try :

// butter knife compile 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' 

Otherwise you can try

https://github.com/avast/android-butterknife-zelezny

to auto gencode from butterknife.

I hope it can help your problem!



回答5:

try this ,you need to add the annotation along with ButterKnife library..

Butterknife library

 compile 'com.jakewharton:butterknife:8.8.1' 

annotation for butterknife

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


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!