【Kotlin】Kotlin 中使用 ButterKnife ( 仅用于适配 Kotlin 语言 | 不推荐新项目使用 )

简介: 【Kotlin】Kotlin 中使用 ButterKnife ( 仅用于适配 Kotlin 语言 | 不推荐新项目使用 )

文章目录

I . 特别注意 : ButterKnife 已停止维护 ( 新项目禁止使用该框架 )

II . Android Studio 中配置 Kotlin 和 ButterKnife 步骤

III . Android Studio 中配置 Kotlin 和 ButterKnife 示例

IV . Kotlin 注解错误使用

V . 错误处理 导入库冲突 ( 与 androidx 冲突 )



I . 特别注意 : ButterKnife 已停止维护 ( 新项目禁止使用该框架 )


1 . 情况说明 : ButterKnife 已经停止维护 , 新项目直接使用 视图绑定 , 数据绑定 进行开发 , 本篇博客只是为了适配老版本项目 ;



2 . 当前需求 : 目前的需求是保证之前的 Java 代码能平稳运行 , 基本框架不变 , 在 Kotlin 中使用 ButterKnife 进行视图绑定操作 ;




II . Android Studio 中配置 Kotlin 和 ButterKnife 步骤


1 . Kotlin 配置 : 不再详细说明 , 创建项目时 , 选择支持 Kotlin 即可 ;



2 . ButterKnife 配置 : ButterKnife 只需要在 Module 下的 build.gradle 构建脚本中配置 ,



① 配置依赖库 : 在 Module 下的 build.gradle 的 dependencies 中进行如下配置 ;


/** androidx 依赖与老版本的 butterknife 冲突 */
implementation 'com.jakewharton:butterknife:10.0.0'
kapt 'com.jakewharton:butterknife-compiler:10.0.0'


② 应用插件 : 在 Module 下的 build.gradle 顶部添加如下配置 ;


apply plugin: 'kotlin-kapt'



3 . 注解使用 :



① 组件定义 : 这里注意 , 只能使用下面的两种方式 , 其它方式会报错 ;


@BindView(R.id.tv_1)
lateinit var tv_1 : TextView
@JvmField
@BindView(R.id.tv_2)
var tv_2 : TextView? = null


② 视图绑定 : 使用 ButterKnife.bind(this) 绑定定义的组件 , 与 Java 中操作一样 ;


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    ButterKnife.bind(this)
}



III . Android Studio 中配置 Kotlin 和 ButterKnife 示例


GitHub 示例 : https://github.com/han1202012/Kotlin_ButterKnife



1 . 工程下的 build.gradle 构建脚本 :


// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    ext.kotlin_version = '1.3.71'
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.6.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
allprojects {
    repositories {
        google()
        jcenter()
    }
}
task clean(type: Delete) {
    delete rootProject.buildDir
}



2 . Module 下的 build.gradle 脚本 :


apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
android {
    compileSdkVersion 29
    buildToolsVersion "29.0.2"
    defaultConfig {
        applicationId "kim.hsl.kb"
        minSdkVersion 24
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.core:core-ktx:1.0.2'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    /** androidx 依赖与老版本的 butterknife 冲突 */
    implementation 'com.jakewharton:butterknife:10.0.0'
    kapt 'com.jakewharton:butterknife-compiler:10.0.0'
}



3 . Kotlin 代码的 Activity 中使用 ButterKnife 注解 : 注意只能使用下面的两种方式 ;


package kim.hsl.kb
import android.app.Activity
import android.os.Bundle
import android.util.Log
import android.widget.TextView
import butterknife.BindView
import butterknife.ButterKnife
class MainActivity : Activity() {
    @BindView(R.id.tv_1)
    lateinit var tv_1 : TextView
    @JvmField
    @BindView(R.id.tv_2)
    var tv_2 : TextView? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        ButterKnife.bind(this)
        Log.i("TAG", tv_1?.text.toString())
        Log.i("TAG", tv_2?.text.toString())
    }
}



IV . Kotlin 注解错误使用


1 . 报错内容 :


@BindView fields must not be private or static. (kim.hsl.kb.MainActivity.tv_2)
    private android.widget.TextView tv_2;


2 . 报错原因 : 使用了如下声明方式 , @BindView(R.id.tv_2) var tv_2 : TextView? = null ;



3 . 只能使用下面两种声明方式 : ① 使用 lateinit 修饰变量 , ② 使用 @JvmField 注解 ;


@BindView(R.id.tv_1)
lateinit var tv_1 : TextView
@JvmField
@BindView(R.id.tv_2)
var tv_2 : TextView? = null



V . 错误处理 导入库冲突 ( 与 androidx 冲突 )


1 . 报错信息如下 :


The given artifact contains a string literal with a package reference 'android.support.v4.content' 
that cannot be safely rewritten. Libraries using reflection such as annotation processors need to 
be updated manually to add support for androidx.


2 . 报错原因 : 引入了 androidx 包依赖 , 与低版本的 butterknife 产生了冲突 , 二者不能同时使用 ;


Static interface methods are only supported starting with Android N (--min-api 24): 
void butterknife.Unbinder.lambda$static$0()

3 . 总结 : 坑有点多 , 新应用能不用 ButterKnife 就不用 , 10.0.0 版本的 butterknife 必须要求 android-24 以上最低兼容版本 , 对于商业项目来说 , 这是不可接受的 ;



4 . 推荐用法 : 老版本应用 ( 没有使用 androidx ) 继续使用老版本的 ButterKnife , 新版本的应用就别用这个框架了 , 使用 JetPack 中的 视图 / 数据 绑定 ;



① 老项目 : 没有使用 androidx 依赖 , 可以使用低版本的 ButterKnife , 这也是唯一的途径了 ;


dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    testImplementation 'junit:junit:4.12'
    /** androidx 依赖与老版本的 butterknife 冲突 */
    implementation 'com.jakewharton:butterknife:8.8.1'
    kapt 'com.jakewharton:butterknife-compiler:8.8.1'
}



② 新项目 : 如果使用了 androidx 依赖 , 必须使用高版本的 ButterKnife , 只能兼容 24 以上的最小版本 ; ( 商业项目用了就废了 )


dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.core:core-ktx:1.0.2'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    /** androidx 依赖与老版本的 butterknife 冲突 */
    implementation 'com.jakewharton:butterknife:10.0.0'
    kapt 'com.jakewharton:butterknife-compiler:10.0.0'
}



目前使用了 ButterKnife 的应用 , 无法迁移到 JetPack ;



GitHub 示例 : https://github.com/han1202012/Kotlin_ButterKnife


目录
相关文章
|
3月前
|
安全 Java Android开发
探索安卓开发的未来:Kotlin语言的崛起与挑战
在这篇文章中,我们将深入探讨Kotlin语言在安卓开发领域的应用及其对传统Java开发的颠覆性影响。通过分析Kotlin的特性、社区支持以及在实际项目中的应用案例,我们揭示了这一现代编程语言如何为开发者提供更简洁、更安全的编程体验,并讨论了它在面对性能优化和向后兼容性时所面临的挑战。文章旨在为读者呈现一个全面的视角,评估Kotlin作为未来安卓开发主流语言的可能性。
72 1
|
1月前
|
Java Maven Kotlin
idea maven创建kotlin项目
本文介绍了在IntelliJ IDEA中使用Maven创建Kotlin项目的步骤,包括在`pom.xml`文件中添加Maven中央仓库、配置`kotlin-maven-plugin`插件、指定源目录、添加测试插件和执行插件,以及添加Kotlin测试依赖和标准库依赖。文中还提到了如何通过更换镜像或使用代理来解决依赖下载速度慢的问题,并展示了运行示例代码的截图。
82 4
idea maven创建kotlin项目
|
1月前
|
前端开发 JavaScript 测试技术
Kotlin教程笔记 - 适合构建中大型项目的架构模式全面对比
Kotlin教程笔记 - 适合构建中大型项目的架构模式全面对比
37 0
|
3月前
|
Java 网络安全 UED
运用 Kotlin 语言,优化局域网管控软件
在数字化时代,Kotlin语言以其简洁高效的特性,成为优化局域网管控软件的新选择。Kotlin不仅与Java高度兼容,还引入扩展函数等新特性,使代码更精炼易读。通过简洁的语法和强大的函数式编程支持,Kotlin能有效提升开发效率及软件性能。例如,简单的网络连接检测与设备扫描功能即可轻松实现。此外,Kotlin的协程支持让异步编程更为高效,进一步提高了软件响应速度和用户体验。随着Kotlin的发展,其在局域网管控领域的应用将愈发广泛。
28 0
|
4月前
|
安全 Java Android开发
探索Android应用开发中的Kotlin语言
【7月更文挑战第19天】在移动应用开发的浩瀚宇宙中,Kotlin这颗新星以其简洁、安全与现代化的特性,正迅速在Android开发者之间获得青睐。从基本的语法结构到高级的编程技巧,本文将引导读者穿梭于Kotlin的世界,揭示其如何优化Android应用的开发流程并提升代码的可读性与维护性。我们将一起探究Kotlin的核心概念,包括它的数据类型、类和接口、可见性修饰符以及高阶函数等特性,并了解这些特性是如何在实际项目中得以应用的。无论你是刚入门的新手还是寻求进阶的开发者,这篇文章都将为你提供有价值的见解和实践指导。
|
4月前
|
安全 Java Android开发
探索安卓应用开发中的Kotlin语言优势
【7月更文挑战第8天】 在安卓开发的广阔天地中,Kotlin以其优雅的语法、现代化的特性和高效的性能成为了开发者的新宠。本文将深入探讨Kotlin在安卓应用开发中所展现的独特魅力,从语言特性到实际应用案例,揭示其如何简化代码编写、提升开发效率,并增强应用性能。通过对比分析,我们将一同见证Kotlin如何在众多编程语言中脱颖而出,成为安卓开发领域的一股清新之风。
246 11
|
4月前
|
Java Android开发 开发者
探索安卓应用开发的未来:Kotlin语言的崛起与挑战
【7月更文挑战第8天】随着移动设备在人们日常生活中扮演着越来越重要的角色,安卓应用开发的技术趋势和编程语言选择对开发者来说变得至关重要。本文将深入探讨Kotlin语言如何成为安卓开发的首选,分析其带来的优势及面临的挑战,并预测其未来的发展方向。
|
4月前
|
安全 Java 数据库
Spring Boot中的Kotlin语言支持
Spring Boot中的Kotlin语言支持
|
6月前
|
安全 Swift Android开发
构建移动应用:Swift vs Kotlin —— 两大主流语言的对决
【5月更文挑战第11天】Swift与Kotlin在移动应用开发中各有优势。Swift是iOS开发的首选,以其简洁语法、高性能和类型安全著称;而Kotlin是Android的官方推荐语言,以其与Java的无缝互操作、空安全特性和简洁代码受到青睐。两者在语法简洁性、性能和社区支持上表现优秀,但平台兼容性不同。开发者应根据项目需求和目标平台选择合适的语言。
|
6月前
|
移动开发 Java Android开发
Android应用开发:Kotlin语言的优势与实践
【5月更文挑战第7天】 在移动开发的世界中,Android平台的Kotlin语言以其高效、简洁的语法和强大的功能吸引了众多开发者。本文将深入探讨Kotlin语言的核心优势,并通过实际案例展示如何在Android应用开发中有效地运用这一现代编程语言。我们将从语言特性出发,逐步分析其在提升开发效率、改善代码质量以及增强应用性能方面的具体表现,为读者提供一个全面而细致的Kotlin应用开发指南。