57 votes

Android: Kotlin avec Butterknife

Je suis en train d'utiliser Kotlin avec Butterknife pour mon Application Android.

Voici mon build.gradle

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

kapt {
    generateStubs = true
}

Je dispose également d'un EditText et je veux afficher un message à l'aide de ButterKnife lorsqu'il est changé:

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

Cependant, rien ne se passe. J'ai mis un point d'arrêt dans la fonction - et il n'est pas encore exécutée.

P. S: j'ai entendu parler de kotterknife, toutefois, j'ai vu un exemple avec de la pure Butterknife.

Ce que je fais mal?

101voto

Nikhil Jadhav Points 1247

Il n'y a pas besoin de couteau à beurre à Kotlin. Vous pouvez directement utiliser les éléments suivants:

// app: fichier 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
}
 

// fichier de mise en page 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" />
 

// fichier MainActivity.kt

 class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setSupportActionBar(toolbar)

        // use the kotlin property
        tvHello.text="Hi bla bla"
        tvId.text="buubububub"
        //set textcolor  
        tvId.setTextColor(ContextCompat.getColor(this, R.color.colorAccent)) 
        etDemo.hint="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()
    }

    ...
}
 

Pour 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.
        }

    }) 
 

50voto

AyoGitNg Points 271

Dans votre niveau d'application 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'
}
 

Dans votre niveau supérieur build.gradle

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

Activité

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

ou

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

À l'intérieur de OnCreate

 ButterKnife.bind(this)
 

20voto

sashk0 Points 1

Kotlin créateurs disent sur leur site: Kotlin Android Extensions de plugin (automatiquement regroupés dans le Kotlin plugin dans Android Studio) résout le même problème: replacing findViewById avec un concise et simple code. Envisager de l'utiliser , sauf si vous utilisez déjà ButterKnife et ne veulent pas migrer.

et, par exemple,

// 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 est une extension de la propriété pour Activity, et il a le même type tel que déclaré en activity_main.xml.

11voto

Pablo Cegarra Points 2374

Dans votre gradle:

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

Dans votre activité

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

Bien sûr, rappelez - ButterKnife.bind(this) et d'appliquer le plugin sur le haut de votre application.gradle apply plugin: 'kotlin-kapt'

Vérifier exemple complet

Lien complet: https://github.com/JetBrains/kotlin-examples/tree/master/gradle/android-butterknife

3voto

Vaibhav Jadhav Points 79

Vous devez simplement ajouter ButterKnife.kt dans votre arborescence source à partir du lien suivant:
https://github.com/JakeWharton/kotterknife
Cela a fonctionné pour moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X