Android: Kotlin avec Butterknife

j'essaie 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
}

j'ai aussi un texte D'édition et je veux montrer un message en utilisant le bouton D'Or quand il est changé:

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

cependant, rien ne se passe. Je mets un point de rupture dans la fonction - et il n'est même pas exécuté.

P. S: j'ai entendu parler de kotterknife, cependant j'ai vu un exemple avec pur Butterknife.

Ce que je fais mal?

29
demandé sur Rahul Katrakhtalapali 2017-02-25 09:58:02

9 réponses

il n'y a pas besoin de canif à Kotlin. Vous pouvez directement utiliser la syntaxe suivante:

// app:construire.fichier 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 fichier de mise en page

<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 fichier

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

    ...
}

Forontextchangelistner:

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

    }) 
57
répondu Nikhil Jadhav 2018-07-19 08:46:22

dans votre niveau app construire.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 construction de niveau supérieur.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 OnCreate

ButterKnife.bind(this)
23
répondu AyoGitNg 2017-11-11 14:19:36

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, n'oubliez pas ButterKnife.bind(this) et appliquez le plugin sur le dessus de votre application.gradle apply plugin: 'kotlin-kapt'

contrôle complet exemple

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

9
répondu Pablo Cegarra 2017-10-30 16:43:48

les créateurs Kotlin disent sur leur site que: Le plugin Kotlin Android Extensions (automatiquement intégré au plugin Kotlin dans Android Studio) résout le même problème: replacing findViewById avec un code concis et simple. Envisager de l'utiliser sauf si vous utilisez déjà le canif et que vous ne voulez 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 propriété d'extension pour Activity, et il a le même type tel que déclaré dans activity_main.xml.

5
répondu sashk0 2017-06-29 13:41:48

Vous devez simplement ajouter ButterKnife.kt dans votre arborescence des sources à partir du lien suivant:

https://github.com/JakeWharton/kotterknife

Il a travaillé pour moi.

2
répondu Vaibhav Jadhav 2018-03-27 08:47:54

vous pouvez implémenter certaines extensions pour améliorer le comportement de vos vues. Consultez cet exemple pour "onTextChange" dans un texte d'édition régulier:

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

Utilisation:

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

je vote pour kotlin-android-extensions

1
répondu Fredy Mederos 2017-10-30 20:44:33

dis Au revoir à findViewById

Kotlin Android Extensions plugin générera du code supplémentaire qui vous permettra d'accéder aux vues dans la mise en page XML, tout comme s'il s'agissait de propriétés avec le nom de l'id que vous avez utilisé dans la définition de la mise en page XML.

il construit aussi un cache de vue local. Ainsi, la première fois qu'une propriété est utilisée, elle fera un findViewById régulier. Mais la prochaine fois, la vue sera récupérée à partir de le cache, l'accès aux composants sera plus rapide.

Consulter docs pour passer en revue un exemple pour mieux comprendre.

1
répondu hetsgandhi 2018-07-04 10:05:24

ajouter ceci dans la construction de votre projet.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
   }
}
    //Butterknife
compile "com.jakewharton:butterknife:$butterknife_version"
kapt "com.jakewharton:butterknife-compiler:$butterknife_version"
0
répondu dhiku 2017-06-08 11:18:29

à Kotlin, en fait, il n'y a pas besoin (ou) nécessité de passer des concepts de canif. parce que dans votre activité vous pouvez renvoyer directement la vue _id du fichier de mise en page comme indiqué ci-dessous.

mise en page.xml

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

Activité.kt

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

construire.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
}
0
répondu Sackurise 2017-11-15 11:32:43