Android: Kotlin with Butterknife

2020-05-18 04:09发布

I'm trying to use Kotlin with Butterknife for my Android Application.

Here is my build.gradle

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

kapt {
    generateStubs = true
}

I also has an EditText and I want to show a message using ButterKnife when it is changed:

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

However, nothing happens. I put a breakpoint into the function - and it is not even executed.

P.S: I have heard about kotterknife, however I have seen an example with pure Butterknife.

What am I doing wrong?

10条回答
地球回转人心会变
2楼-- · 2020-05-18 04:28

Add this in your Project 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
   }
}

And in your app Build.Gradle add this.

    //Butterknife
compile "com.jakewharton:butterknife:$butterknife_version"
kapt "com.jakewharton:butterknife-compiler:$butterknife_version"
查看更多
何必那么认真
3楼-- · 2020-05-18 04:29

In your gradle:

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

In your activity

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

Of course, remember ButterKnife.bind(this) and apply the plugin on the top of your app.gradle apply plugin: 'kotlin-kapt'

Check full example

Full Link: https://github.com/JetBrains/kotlin-examples/tree/master/gradle/android-butterknife

查看更多
来,给爷笑一个
4楼-- · 2020-05-18 04:36

You can implement some extensions to improve your views behavior. Checkout this example for "onTextChange" in a regular 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)
        }
    })
}

Usage:

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

I vote for kotlin-android-extensions

查看更多
爱情/是我丢掉的垃圾
5楼-- · 2020-05-18 04:39

Kotlin creators tell on their site that: Kotlin Android Extensions plugin (automatically bundled into the Kotlin plugin in Android Studio) solves the same issue: replacing findViewById with a concise and straightforward code. Consider using it unless you're already using ButterKnife and don't want to migrate.

and e.g.

// 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 is an extension property for Activity, and it has the same type as declared in activity_main.xml.

查看更多
兄弟一词,经得起流年.
6楼-- · 2020-05-18 04:40

Jake Wharton created new library for kotlin called kotterknife: https://github.com/JakeWharton/kotterknife Gradle:

compile 'com.jakewharton:kotterknife:0.1.0-SNAPSHOT'

View:

val lastName: TextView by bindView(R.id.last_name)

  // Optional binding.
  val details: TextView? by bindOptionalView(R.id.details)

  // List binding.
  val nameViews: List<TextView> by bindViews(R.id.first_name, R.id.last_name)

  // List binding with optional items being omitted.
  val nameViews: List<TextView> by bindOptionalViews(R.id.first_name, R.id.middle_name, R.id.last_name)
查看更多
叛逆
7楼-- · 2020-05-18 04:41

In Kotlin, actually there is no need (or) necessity for going ButterKnife concepts. because in your activity you can directly refer the view _id of the layout file as referred below.

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(app)

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'

android {
   dependencies {... }
}

kapt {
    generateStubs = true
}
查看更多
登录 后发表回答