Android: Kotlin con Butterknife

Estoy tratando de usar Kotlin con Butterknife para mi aplicación Android.

Aquí está mi build.gradle

dependencies { ... compile 'com.jakewharton:butterknife:8.0.1' kapt 'com.jakewharton:butterknife-compiler:8.0.1' } kapt { generateStubs = true } 

También tengo un EditText y quiero mostrar un mensaje usando ButterKnife cuando se cambia:

 @OnTextChanged(R.id.input) fun test() { toast(1) } 

Sin embargo, no pasa nada. Pongo un punto de interrupción en la función – y ni siquiera se ejecuta.

PS: He oído hablar de kotterknife, sin embargo he visto un ejemplo con Butterknife puro.

¿Qué estoy haciendo mal?

Utilice kotlin kotterknife en lugar de butterknife.

 https://github.com/JakeWharton/kotterknife 

No hay necesidad de butterknife en kotlin, puede utilizar directamente como sigue

// app: build

  apply plugin: 'com.android.application' ` apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' android { compileSdkVersion 26 buildToolsVersion "26.0.1" defaultConfig { applicationId "com.example.nikhiljadhav.myapplication" minSdkVersion 15 targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" implementation 'com.android.support:appcompat-v7:26.0.0' implementation 'com.android.support.constraint:constraint-layout:1.0.2' implementation 'com.android.support:design:26.0.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.0' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.0' } kapt { generateStubs = true } 

// archivo xml

 <TextView android:id="@+id/tvHello" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" android:layout_marginBottom="8dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintTop_toTopOf="parent" android:layout_marginTop="8dp" app:layout_constraintEnd_toEndOf="parent" android:layout_marginEnd="8dp" app:layout_constraintStart_toStartOf="parent" android:layout_marginStart="8dp" /> <TextView android:id="@+id/tvId" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" android:layout_marginBottom="8dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintTop_toTopOf="parent" android:layout_marginTop="8dp" app:layout_constraintEnd_toEndOf="parent" android:layout_marginEnd="8dp" app:layout_constraintStart_toStartOf="parent" android:layout_marginStart="8dp" /> <EditText android:id="@+id/etDemo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="8dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintTop_toTopOf="parent" android:layout_marginTop="8dp" app:layout_constraintEnd_toEndOf="parent" android:layout_marginEnd="8dp" android:onClick="onClick" app:layout_constraintStart_toStartOf="parent" android:layout_marginStart="8dp" /> 

// MainActivity.kt file

 class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) setSupportActionBar(toolbar) tvHello.setText("Hi bla bla") tvId.setText("buubububub") etDemo.setHint("nhdodfhfgf") tvId.setOnClickListener{ view-> onClick(view) } fab.setOnClickListener { view -> Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show() } } fun onClick(view: View) { Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show() } 

Los creadores de Kotlin dicen en su sitio que: El complemento Kotlin Android Extensions (incluido automáticamente en el complemento de Kotlin en Android Studio) resuelve el mismo problema: ubicar findViewById con un código conciso y directo. Considere usarlo a menos que ya esté utilizando ButterKnife y no desee migrar.

Y por ejemplo

 // Using R.layout.activity_main from the main source set import kotlinx.android.synthetic.main.activity_main.* class MyActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) textView.setText("Hello, world!") // Instead of findViewById(R.id.textView) as TextView } } 

textView es una propiedad de extensión para Activity y tiene el mismo tipo que declarado en activity_main.xml .

Añada esto en su Proyecto Build.gradle

 buildscript { ext.kotlin_version = '1.1.2-4' ext.butterknife_version = '8.6.0' repositories { maven { url 'https://maven.google.com' } jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.0.0-alpha1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "com.jakewharton:butterknife-gradle-plugin:$butterknife_version" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } 

Y en su aplicación Build.Gradle añadir esto.

  //Butterknife compile "com.jakewharton:butterknife:$butterknife_version" kapt "com.jakewharton:butterknife-compiler:$butterknife_version" 

Basta con ver y utilizar la Biblioteca Anko con kotlin https://github.com/Kotlin/anko

En su gradle:

 compile 'com.jakewharton:butterknife:8.8.0' kapt "com.jakewharton:butterknife-compiler:8.8.0" 

En tu actividad

 @BindView(R.id.toolbar) lateinit var mToolbar: Toolbar 

Por supuesto, recuerda ButterKnife.bind(this) y aplicar el complemento en la parte superior de su app.gradle apply plugin: 'kotlin-kapt'

Ver ejemplo completo

En tu nivel de aplicación build.gradle

 apply plugin: 'kotlin-android' kapt { generateStubs = true } dependencies { compile 'com.jakewharton:butterknife:8.4.0' kapt 'com.jakewharton:butterknife-compiler:8.4.0' } 

En tu nivel superior build.gradle

 buildscript { ext.kotlin_version = '1.1.3' repositories { jcenter() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } 

En tu actividad

 @BindView(R.id.toolbar) @JvmField var toolbar: Toolbar? = null 

o

 @BindView(R.id.toolbar) lateinit var toolbar: Toolbar 

Inside OnCreate

 ButterKnife.bind(this) 
  • La construcción de kapt falla con el procesador Android de Dagger
  • Uso de Kotlin en un módulo de biblioteca sin utilizarlo en el módulo de aplicaciones
  • ¿Tiene Kotlin personalizado obtener la llamada al método de ejecución
  • Corotinas de Kotlin de la manera correcta en Android
  • Kotlin y Dagger2
  • ¿Hay alguna manera de reutilizar una instancia de Job?
  • Experimental JUnit apoyo en Android + Kotlin no funciona
  • La llamada a API no funciona dentro de Anko Async
  • Gradle 3.0.0-alpha1 no es compatible con kotlin-android plugin 1.1.2-3?
  • Advertencia: Advertencia: Versión de origen compatible 'RELEASE_7' del procesador de anotaciones 'android.arch.lifecycle.LifecycleProcessor' less than -source '1.8'
  • La instancia de fragmento se conserva pero el fragmento secundario no se vuelve a conectar
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.