android - from - fragment set listener
Android: Kotlin con Butterknife (9)
Añade esto en tu Proyecto 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
}
}
Y en tu aplicación Build.Gradle agrega esto.
//Butterknife
compile "com.jakewharton:butterknife:$butterknife_version"
kapt "com.jakewharton:butterknife-compiler:$butterknife_version"
Estoy tratando de usar Kotlin con Butterknife para mi aplicación de Android.
Aquí está mi build.gradle
dependencies {
...
compile ''com.jakewharton:butterknife:8.0.1''
kapt ''com.jakewharton:butterknife-compiler:8.0.1''
}
kapt {
generateStubs = true
}
También tengo un EditText y quiero mostrar un mensaje usando ButterKnife cuando se cambia:
@OnTextChanged(R.id.input)
fun test() {
toast(1)
}
Sin embargo, no pasa nada. Puse un punto de interrupción en la función, y ni siquiera se ejecuta.
PD: He oído hablar de kotterknife, sin embargo, he visto un example con Butterknife puro.
¿Qué estoy haciendo mal?
En Kotlin, en realidad no hay necesidad (o) necesidad de utilizar los conceptos de ButterKnife. porque en su actividad puede referirse directamente a la vista _id del archivo de diseño como se indica a continuación.
layout.xml
<Button
android:id="@+id/btn_prestage"
android:layout_width="20dp"
android:layout_height="20dp"
android:background="@drawable/prestaging_off"/>
Actividad.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 (aplicación)
apply plugin: ''com.android.application''
apply plugin: ''kotlin-android''
apply plugin: ''kotlin-android-extensions''
apply plugin: ''kotlin-kapt''
android {
dependencies {... }
}
kapt {
generateStubs = true
}
En tu nivel de aplicación 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''
}
En tu nivel superior build.gradle
buildscript {
ext.kotlin_version = ''1.1.3''
repositories {
jcenter()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
Actividad
@BindView(R.id.toolbar) @JvmField var toolbar: Toolbar? = null
o
@BindView(R.id.toolbar) lateinit var toolbar: Toolbar
Dentro de OnCreate
ButterKnife.bind(this)
Los creadores de Kotlin informan en su sitio que: el complemento de Kotlin para las extensiones de Android (incluido automáticamente en el complemento de Kotlin en Android Studio) resuelve el mismo problema: remplace findViewById
con un código conciso y directo. Considera usarlo a menos que ya estés usando ButterKnife y no quieras migrar.
y por ejemplo
// 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
es una propiedad de extensión para Activity
, y tiene el mismo tipo que se declara en activity_main.xml
.
No hay necesidad de cuchillo de mantequilla en Kotlin. Puedes usar directamente lo siguiente:
// app: build.gradle file
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
}
// archivo de diseño 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" />
// Archivo 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()
}
...
}
Para 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.
}
})
Puedes implementar algunas extensiones para mejorar el comportamiento de tus vistas. Consulte este ejemplo para "onTextChange" en un editText regular:
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)
}
})
}
Uso:
m_editText.onTextChange { text, _, _, _ ->
m_textView.text = text
}
Voto por kotlin-android-extensions
Simplemente debe agregar ButterKnife.kt
a su árbol de fuentes desde el siguiente enlace:
https://github.com/JakeWharton/kotterknife
Funcionó para mí.
Dígale adiós a findViewById o a cualquier biblioteca como Butterknife porque,
El complemento Kotlin Android Extensions generará un código adicional que le permitirá acceder a las vistas en el diseño XML, como si fueran propiedades con el nombre del ID que usó en la definición de diseño XML.
También construye un caché de vista local. Así que la primera vez que se usa una propiedad, hará un findViewById regular. Pero la próxima vez, la vista se recuperará del caché, por lo que el acceso a los componentes será más rápido.
Consulte los antonioleiva.com/kotlin-android-extensions para ver un ejemplo para una mayor comprensión.
En tu gradle:
compile ''com.jakewharton:butterknife:8.8.0''
kapt "com.jakewharton:butterknife-compiler:8.8.0"
En tu actividad
@BindView(R.id.toolbar)
lateinit var mToolbar: Toolbar
Por supuesto, recuerde ButterKnife.bind(this)
y aplique el complemento en la parte superior de su app.gradle apply plugin: ''kotlin-kapt''
Enlace completo: example