kotlin和java混合开发总结 |
您所在的位置:网站首页 › kotlin项目转java项目 › kotlin和java混合开发总结 |
声明:本文是作者AWeiLoveAndroid原创,版权归作者AWeiLoveAndroid所有,侵权必究。如若转发,请注明作者和来源地址!未经授权,严禁私自转载! 我本来是不想学习kotlin的,但是现在的形势,很多公司都在使用kotlin开发,可以说学会kotlin也是无奈之举,既然是潮流,谷歌也在大力推广,所以还是只能硬着头皮逼迫自己学一下,也能更快适应公司的需要。正所谓:“识时务者为俊杰”,改变不了公司的发展,那就改变自己。本文首发在慕课网,转载请注明原文链接和作者信息。 废话少说,直接上正题。本文主要讲解kotlin和java混合开发的一个初探。这是一个入门篇的总结博客。我这里使用的Kotlin版本是最新的版本,版本号是 1.3.0 目录本文配套源码请看github:github.com/AweiLoveAnd… 一、Kotlin集成步骤和注意事项(基于Kotlin1.3.0): 1.在工程根目录的 build.gradle 里面的 buildscript 节点的 dependencies 子节点 添加一行依赖: buildscript { dependencies { // 添加这一行依赖 classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } 复制代码2.在工程根目录 build.gradle 的buildscript节点 配置kotlin版本号: buildscript { ext.kotlin_version = '1.3.0' ... } 复制代码3.在项目module的 build.gradle 的顶部添加以下代码: apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' 复制代码4.在项目module的 build.gradle的dependencies 节点里添加以下代码: dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" } 复制代码5.注意事项: 1.本地kotlin版本路径:Android Studio安装根路径/gradle/m2repository/org/jetbrains/kotlin/kotlin-stdlib/ 2.不同了版本的依赖库 1.2.0以前使用这个依赖库 implementation "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version" 1.2.0+版本使用这个依赖库 implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" 复制代码3.Tools --> kotlin --> Decompiler Kotlin to Java,如果该选项是灰色,请下载插件 Java Bytecode Decompiler 4.这几个依赖库的区别: 依赖库名称 含义 implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" 1.2.0版本以前使用的配置,兼容java7 implementation "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version" 1.2.0以前使用的配置,兼容java8 implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 1.2.0+版本以前使用的配置,兼容java7 implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" 1.2.0+版本使用的配置,兼容java8 5.Kotlin下载到本地的路径在哪里?工程目录的末尾有个External Libraries,选择某一个kotlin的jar包,打开, 右键选择 Show in Explorer,就可以看到kotlin的jar包和资源下载在本地的路径了。 如下图所示: kotlin的所有jar下载的路径为: C:/Users/Administrator/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/ Users是我的电脑名。 如下图所示: 根路径的 build.gradle 配置: kotlinlibrary 的 build.gradle 配置: 点击菜单栏Tools-->Kotlin-->Decompile Kotlin To Java 就可以了,我用的AS3.1.3,不知道为啥我的是灰色的?有人可以告诉我原因吗? 这一部分源码请看github:github.com/AweiLoveAnd… (1)创建一个名为 KotlinAndJavaDemo 的项目创建一个module,取名为JavaModule,跟普通创建一样,只是最后一步要选择使用的语言是Java,如图所示:代码、资源文件、预览图都和平时开发是一样的。 我的kotlin的module名为app, 依赖了一个java的名为javalibrary的lib。我需要在app里面使用javalibrary的ResourcesUtils,然后获取状态栏高度,如果成功,就弹吐司显示状态栏高度。 这个是javalibrary的ResourcesUtils: /** * 描述: * 资源工具类 */ public class ResourcesUtils { /** * 获取状态栏高度 * @return 状态栏高度 */ public static int getStatusBarHeight(Context context) { //获取status_bar_height资源的ID int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { //根据资源ID获取响应的尺寸值 return context.getResources().getDimensionPixelSize(resourceId); } else { return dip2px(context,24f); } } // dp 转成 px private static int dip2px(Context context, Float dpValue) { float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } } 复制代码再来看看app的MainActivity里面的使用: class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) init(this) } fun init(context: Context) { val statusBarHeight = ResourcesUtils.getStatusBarHeight(context) Toast.makeText(context, "状态栏高度为:$statusBarHeight",Toast.LENGTH_SHORT).show() } } 复制代码(4)我们在看看看完整的工程结构图这一部分源码请看github:github.com/AweiLoveAnd… (1)创建一个名为 KotlinAndJavaDemo 的项目创建一个module,取名为KotlinModule,跟普通创建一样,只是最后一步要选择使用的语言是Kotlin,如图所示:我的Java的module名为app, 依赖了一个Kotlin的名为kotlinlibrary的lib。我需要在app里面使用kotlinlibrary的ResourcesUtils,然后获取状态栏高度,如果成功,就弹吐司显示状态栏高度。 这个是kotlinlibrary的ResourcesUtils: package com.lzw.kotlinlibrary import android.content.Context /** * 描述: * 资源工具类 */ class ResourcesUtils { // 伴生对象 这里面包裹的方法 实际上类似于java的静态方法 companion object { /** * 获取状态栏高度 * @return 状态栏高度 */ fun getStatusBarHeight(context: Context): Int { //获取status_bar_height资源的ID val resourceId = context.resources.getIdentifier("status_bar_height", "dimen", "android") return if (resourceId > 0) { //根据资源ID获取响应的尺寸值 context.resources.getDimensionPixelSize(resourceId) } else { dip2px(context, 40f) } } /** * dp 转 px(像素) */ fun dip2px(context: Context, dpValue: Float?): Int { val scale = context.resources.displayMetrics.density return (dpValue!! * scale + 0.5f).toInt() } /** * px(像素) 的单位 转 dp */ fun px2dip(context: Context, pxValue: Float?): Int { val scale = context.resources.displayMetrics.density return (pxValue!! / scale + 0.5f).toInt() } } } 复制代码再来看看app的MainActivity里面的使用: public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(this); } private void init(Context context) { int statusBarHeight = ResourcesUtils.Companion.getStatusBarHeight(context); Toast.makeText(context, "状态栏高度为:" + statusBarHeight + "像素",Toast.LENGTH_SHORT).show(); } } 复制代码(4)我们在看看看完整的工程结构图我们还是拿第一个前面的工程KotlinAndJavaDemo为例,我在moduleapp里面同时使用kotlin和java两种语言做开发。 为了便于区分,需要在该module的build.gradle文件做配置。 默认情况,Kotlin文件存放在src/main/java/文件夹下。若是需要隔开java文件和Kotlin文件,我们可以指定一个专门存放Kotlin文件的文件夹, 首先在src/main目录下创建文件夹kotlin,然后做以下配置: android { // 配置一个路径专门存放kotlin文件 sourceSets { main.java.srcDirs += 'src/main/kotlin' } 复制代码图示如下: (1)如果主工程是kotlin写的,部分是Java写的。 比如Activity是kotlin写的,工具类是java写的,实例代码如下: package com.lzw.kotlinandjavademo import android.content.Context import android.os.Bundle import android.support.v7.app.AppCompatActivity import android.util.Log import android.widget.Toast // 使用本包名里面的对应文件 import com.lzw.kotlinandjavademo.util.ResourcesUtils class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) init(this) } fun init(context: Context) { val statusBarHeight = ResourcesUtils.getStatusBarHeight(context) Toast.makeText(context, "状态栏高度为:$statusBarHeight 像素", Toast.LENGTH_SHORT).show() Log.e("tag", "状态栏高度为:$statusBarHeight 像素") } } 复制代码工程目录结构如图所示: (2)如果主工程是Java写的,部分是Kotlin写的。 比如Activity是Java写的,工具类是kotlin写的,实例代码如下: package com.lzw.javaandkotlindemo; import android.content.Context; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.Toast; import com.lzw.javaandkotlindemo.util.ResourcesUtils; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(this); } private void init(Context context) { int statusBarHeight = ResourcesUtils.Companion.getStatusBarHeight(context); Toast.makeText(context, "状态栏高度为:" + statusBarHeight + "像素",Toast.LENGTH_SHORT).show(); } } 复制代码工程目录结构如图所示: |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |