Android:Kotlin和Butterknife

Rah*_*hul 44 android kotlin butterknife

我正在尝试将Kotlin和Butterknife用于我的Android应用程序.

这是我的build.gradle

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

kapt {
    generateStubs = true
}
Run Code Online (Sandbox Code Playgroud)

我还有一个EditText,我想在更改时使用ButterKnife显示一条消息:

@OnTextChanged(R.id.input)
fun test() {
   toast(1)
}
Run Code Online (Sandbox Code Playgroud)

然而,没有任何反应.我在函数中加了一个断点 - 它甚至都没有执行.

PS:我听说过kotterknife,但是我看到了一个纯粹的Butterknife 的例子.

我究竟做错了什么?

Nik*_*hav 90

在Kotlin没有必要使用奶油刀.您可以直接使用以下内容:

// app: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
}
Run Code Online (Sandbox Code Playgroud)

// 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" />
Run Code Online (Sandbox Code Playgroud)

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

    ...
}
Run Code Online (Sandbox Code Playgroud)

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

    }) 
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,Google不建议再使用合成视图引用。https://old.reddit.com/r/androiddev/comments/ala9p2/why_kotlinx_synthetic_is_no_longer_a_recommended/efdvpkg/ (7认同)
  • 来自片段的注释你需要从`onViewCreated`调用https://antonioleiva.com/kotlin-android-extensions/ (6认同)
  • 那么如何将@OnTextChanged与Kotlin Extensions一起使用? (5认同)
  • 字符串,颜色,尺寸绑定怎么样? (2认同)
  • 这个答案可以做更多的解释。 (2认同)

小智 35

在您的应用级别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'
}
Run Code Online (Sandbox Code Playgroud)

在您的顶级build.gradle中

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

活动

@BindView(R.id.toolbar)  @JvmField var toolbar: Toolbar? = null
Run Code Online (Sandbox Code Playgroud)

要么

@BindView(R.id.toolbar) lateinit var toolbar: Toolbar
Run Code Online (Sandbox Code Playgroud)

OnCreate里面

ButterKnife.bind(this)
Run Code Online (Sandbox Code Playgroud)


小智 15

Kotlin创建者在他们的网站上告诉我们:Kotlin Android Extensions插件(自动捆绑到Android Studio中的Kotlin插件中)解决了同样的问题:使用简洁直接的代码进行替换findViewById.除非您已经使用ButterKnife并且不想迁移,否则请考虑使用它.

例如

// 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
    }
}
Run Code Online (Sandbox Code Playgroud)

textView是一个扩展属性Activity,它与声明的类型相同activity_main.xml.


Pab*_*rra 10

在你的gradle中:

compile 'com.jakewharton:butterknife:8.8.0'
kapt "com.jakewharton:butterknife-compiler:8.8.0"
Run Code Online (Sandbox Code Playgroud)

在你的活动中

@BindView(R.id.toolbar)
lateinit var mToolbar: Toolbar
Run Code Online (Sandbox Code Playgroud)

当然,请记住ButterKnife.bind(this)并在app.gradle顶部应用该插件apply plugin: 'kotlin-kapt'

检查完整示例

丰联:https://github.com/JetBrains/kotlin-examples/tree/master/gradle/android-butterknife


dhi*_*iku 2

将其添加到您的项目 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
   }
}
Run Code Online (Sandbox Code Playgroud)

并在您的应用程序 Build.Gradle 中添加此内容。

    //Butterknife
compile "com.jakewharton:butterknife:$butterknife_version"
kapt "com.jakewharton:butterknife-compiler:$butterknife_version"
Run Code Online (Sandbox Code Playgroud)