java - example - how to use butterknife
Butterknife 8.4.0 no encuentra vistas despuĆ©s de volver a ejecutar la aplicaciĆ³n. Obtiene una NullPointerException (4)
Creo que te falta en el proyecto gradle algo como esto:
classpath ''com.android.tools.build:gradle:2.2.2''
Después de volver a ejecutar la aplicación en Android Studio Butterknife.bind(this)
ya no encuentra las vistas. La única solución confiable que encontré hasta ahora es mediante la Cleaning/Rebuilding Project
y volver a ejecutarla. Luego vuelve a encontrar las vistas hasta la próxima repetición. Esto es increíblemente molesto hasta ahora y toma un mínimo de dos minutos para una reconstrucción.
Tengo el siguiente build.gradle
android {
compileSdkVersion 24
buildToolsVersion "25.0.0"
defaultConfig {
applicationId "xx"
minSdkVersion 21
targetSdkVersion 24
versionCode x
versionName "xxx"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
jackOptions {
enabled true
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile(''proguard-android.txt''), ''proguard-rules.pro''
}
}
packagingOptions {
exclude ''META-INF/NOTICE''
exclude ''META-INF/LICENSE''
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
annotationProcessor ''com.jakewharton:butterknife-compiler:8.4.0''
compile ''com.jakewharton:butterknife:8.4.0''
androidTestCompile ''com.android.support.test.espresso:espresso-core:2.2.2''
androidTestCompile ''com.android.support.test:runner:0.5''
androidTestCompile ''com.android.support:support-annotations:24.2.1''
compile ''com.android.support:appcompat-v7:24.2.1''
compile ''com.android.support:design:24.2.1''
compile ''com.android.support:support-v13:24.2.1''
compile ''com.android.support:support-v4:24.2.1''
compile ''com.android.support.test.espresso:espresso-idling-resource:2.2.2''
}
También estoy usando las herramientas de compilación com.android.tools.build:gradle:2.2.2
Con Butterknife.setDebug(true)
obtengo lo siguiente:
D/ButterKnife: Looking up binding for xx.LoginFragment
D/ButterKnife: Not found. Trying superclass xx.BaseFragment
D/ButterKnife: Not found. Trying superclass android.app.Fragment
D/ButterKnife: MISS: Reached framework class. Abandoning search.
El BaseFragment
realiza el enlace y LoginFragment
extiende. Se parece a esto
BaseFragment import android.app.Fragment;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(getLayoutResourceId(), container, false);
ButterKnife.setDebug(true);
unbinder = ButterKnife.bind(this, v);
initViews(v);
return v;
}
LoginFragment
@BindView(R.id.inputEmail)
protected EditText inputEmail;
@Override
protected void initViews(View v) {
EditTextFocusListener focusListener = new EditTextFocusListener();
inputEmail.setOnFocusChangeListener(focusListener);
}
Y el stacktrace
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method ''void android.widget.EditText.setOnFocusChangeListener(android.view.View$OnFocusChangeListener)'' on a null object reference
at xx.LoginFragment.initViews(LoginFragment.java:51)
at xx.BaseFragment.onCreateView(BaseFragment.java:53)
Como dije antes, la única solución que es confiable en este momento es hacer una clean/rebuild
de todo el proyecto. Esta estructura exacta funcionó bien antes de usar jackCompiler
y no puedo deshabilitarla más. La mayor parte del código depende de ello.
Esta es una solución temporal hasta que alguien tenga una mejor respuesta o se publique en el canal estable.
Cambié al canal canario y actualicé Android Studio a 2.3 Canary y com.android.tools.build:gradle:2.3.0-alpha1
. Todo lo demás se mantiene igual que en el post de apertura.
EDITAR: En última instancia, decidí desactivar el jackCompiler
y volver a Java 1.7. Es estable ahora.
jackOptions {
enabled false
}
La página github dice que use annotationProcessor
pero la página jakewharton.github.io dice que use apt
.
Basado en this publicación SO, parece que es un problema con las instrucciones frente a la versión del complemento Gradle de Android que se usa (aunque estoy usando la versión 2.2.2 y aún veo el problema).
Actualización para octubre de 2016: probablemente ya no necesite apt y el complemento android-apt. La versión 2.2 del complemento Gradle de Android tiene una configuración de procesador de anotaciones que debería utilizar en su lugar.
Pero deberías intentar esto
Trata de cambiar
annotationProcessor ''com.jakewharton:butterknife-compiler:8.4.0''
con
apt ''com.jakewharton:butterknife-compiler:8.4.0''
Ver here Por favor, incluya esto:
En Gradle
:
compile ''com.jakewharton:butterknife:8.4.0''
annotationProcessor ''com.jakewharton:butterknife-compiler:8.4.0''
también.
Esto puede ayudarte.