Android: Kotlin с Butterknife

Я пытаюсь использовать Kotlin с Butterknife для моего приложения Android.

Вот мой build.gradle

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

У меня также есть EditText, и я хочу показать сообщение с использованием ButterKnife, когда оно будет изменено:

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

Однако ничего не происходит. Я поставил точку останова в функцию – и она даже не выполнена.

PS: Я слышал о kotterknife, однако я видел пример с чистым Butterknife.

Что я делаю не так?

    В Котлине нет необходимости в масляном ноже. Вы можете напрямую использовать следующее:

    // приложение: файл build.gradle

     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 } 

    // файл макета 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

     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() } ... } 

    Для onTextChangeListner:

     etText.addTextChangedListener(object : TextWatcher{ override fun afterTextChanged(p0: Editable?) { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } }) 

    На вашем уровне приложения 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' } 

    В вашем верхнем уровне build.gradle

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

    Мероприятия

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

    или

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

    Внутри OnCreate

     ButterKnife.bind(this) 

    В вашей градиенте:

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

    В вашей деятельности

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

    Конечно, помните ButterKnife.bind(this) и примените плагин в верхней части вашего приложения app.gradle apply plugin: 'kotlin-kapt'

    Проверьте полный пример

    Полная ссылка: https://github.com/JetBrains/kotlin-examples/tree/master/gradle/android-butterknife

    Создатели Kotlin сообщают на своем сайте, что: плагин Kotlin Android Extensions (автоматически подключенный к плагину Kotlin в Android Studio) решает ту же проблему: r eplacing findViewById с кратким и простым кодом. Подумайте об использовании этого, если вы уже не используете ButterKnife и не хотите мигрировать.

    и, например,

     // 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 – это свойство расширения для Activity , и оно имеет тот же тип, что и объявленный в activity_main.xml .

    Вы можете реализовать некоторые расширения, чтобы улучшить поведение ваших просмотров. Оформить этот пример для «onTextChange» в регулярном editText:

     fun EditText.onTextChange(callback: (text: CharSequence?, start: Int, before: Int, count: Int) -> Unit) { addTextChangedListener(object : TextWatcher { override fun afterTextChanged(s: Editable?) {} override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { callback(s, start, before, count) } }) } 

    Применение:

     m_editText.onTextChange { text, _, _, _ -> m_textView.text = text } 

    Я голосую за kotlin-андроид-расширения

    Добавьте это в свой проект 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 } } 

    И в вашем приложении Build.Gradle добавьте это.

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

    В Котлине на самом деле нет необходимости (или) необходимости переходить к концепциям ButterKnife. потому что в вашей деятельности вы можете напрямую ссылаться на вид _id файла макета, как указано ниже.

    layout.xml

     <Button android:id="@+id/btn_prestage" android:layout_width="20dp" android:layout_height="20dp" android:background="@drawable/prestaging_off"/> 

    Activity.kt

      btn_prestage.setBackgroundResource(R.drawable.staging_on) btn_prestage.setOnClickListener{ view -> Snackbar.make(view, "My Action", Snackbar.LENGTH_LONG) .setAction("Action", null).show() } 

    build.gradle (приложение)

     apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' android { dependencies {... } } kapt { generateStubs = true } 
    Intereting Posts
    Экземпляр фрагмента сохраняется, но дочерний фрагмент не повторно прикреплен Мне нужно перезапустить IDE для запуска тестов Каков наилучший способ в kotlin для метода toString () для нулевого объекта возвращать пустую строку вместо "null" Котлин: Итерация над компонентами объекта kotlin null указатель execption Выделенный объект с помощью метода Mockito Kotlin без обрушения Можно ли использовать Ломбок с Котлином? Как использовать Kotlin в проектах AppEngine с использованием Gradle Большое время компиляции кода Kotlin в IntelliJ Просмотр не обновляется после первого запуска LiveData при использовании фоновой работы в Android kapt – java.lang.OutOfMemoryError: превышен верхний предел GC Пользовательский TypeFace в Kotlin Программно Задержка с изменением размера дочерних элементов RecyclerView Есть ли способ сделать виджет ViewPager DecorView с содержимым фрагмента? Kotlin на Android: наведите курсор на список