setsupportactionbar from change android kotlin butterknife

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



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

example

Enlace completo: example