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?
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.
}
})
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)
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'
Lien Complet: https://github.com/JetBrains/kotlin-examples/tree/master/gradle/android-butterknife
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
.
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.
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
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.
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"
à 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
}