Kotlin和Java混合开发总结(基于Kotlin1.3.0版本)

我本来是不想学习kotlin的,但是现在的形势,很多公司都在使用kotlin开发,可以说学会kotlin也是无奈之举,既然是潮流,谷歌也在大力推广,所以还是只能硬着头皮逼迫自己学一下,也能更快适应公司的需要。正所谓:“识时务者为俊杰”,改变不了公司的发展,那就改变自己。

废话少说,直接上正题。本文主要讲解kotlin和java混合开发的一个初探。这是一个入门篇的总结博客。我这里使用的Kotlin版本是最新的版本,版本号是 1.3.0

目录

本文配套源码请看github:https://github.com/AweiLoveAndroid/Kotlin-learn/

一、Kotlin集成步骤和注意事项(基于Kotlin1.3.0):1.在工程根目录的 `build.gradle` 里面的 `build` 节点的 `dependencies` 子节点添加一行依赖:build {

dependencies {

// 添加这一行依赖

classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

}

}

2.在工程根目录 `build.gradle` 的`build`节点 配置kotlin版本号:build {

ext.kotlin_version = '1.3.0'

...

}

3.在项目module的 `build.gradle` 的顶部添加以下代码:applyplugin: '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是我的电脑名。

如下图所示:

二、Kotlin和Java文件互相转换(1)Java转Kotlin

  • 1.选中Java文件,点击菜单栏Code-->Convert Java File to Kotlin File ,即可把java文件转换成kotlin文件。

  • 2.点击右上角提示的 configue ,然后会出现一个弹窗。

  • 3.设置工程里面哪些需要配置kotlin文件支持。比如我这里选中的是single module,module名为kotlinlibrary。还可以选择kotlin的编译和运行版本号,比如我选择的1.2.30,然后点击OK即可,如下图所示。

  • 4.然后我们就可以看到项目根路径的build.gradle和kotlinlibrary这个module的build.gradle都做了kotlin的配置。如图所示:

根路径的 build.gradle 配置:

kotlinlibrary 的 build.gradle 配置:

(2)Kotlin转Java

点击菜单栏Tools-->Kotlin-->Decompile Kotlin To Java 就可以了,我用的AS3.1.3,不知道为啥我的是灰色的?有人可以告诉我原因吗?

三、Kotlin项目里面集成Java的module

这一部分源码请看github:https://github.com/AweiLoveAndroid/Kotlin-learn/tree/master/KotlinAndJavaDemo

(1)创建一个名为 `KotlinAndJavaDemo` 的项目创建一个module,取名为`JavaModule`,跟普通创建一样,只是最后一步要选择使用的语言是`Java`,如图所示:

(2)项目代码和平常使用Java开发一样。

代码、资源文件、预览图都和平时开发是一样的。

(3)如果我们是一个Java的lib库,kotlin也是可以直接调用的。

我的kotlin的module名为app, 依赖了一个java的名为javalibrary的lib。我需要在app里面使用javalibrary的ResourcesUtils,然后获取状态栏高度,如果成功,就弹吐司显示状态栏高度。

这个是javalibrary的ResourcesUtils:

/**

* 描述:

* 资源工具类

*/

publicclassResourcesUtils{

/**

* 获取状态栏高度

* @return 状态栏高度

*/

publicstaticintgetStatusBarHeight(Context context){

//获取status_bar_height资源的ID

intresourceId = context.getResources().getIdentifier( "status_bar_height", "dimen", "android");

if(resourceId > 0) {

//根据资源ID获取响应的尺寸值

returncontext.getResources().getDimensionPixelSize(resourceId);

} else{

returndip2px(context, 24f);

}

}

// dp 转成 px

privatestaticintdip2px(Context context, Float dpValue){

floatscale = context.getResources().getDisplayMetrics().density;

return( int) (dpValue * scale + 0.5f);

}

}

再来看看app的MainActivity里面的使用:

classMainActivity: AppCompatActivity() {

overridefunonCreate(savedInstanceState: Bundle?){

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main)

init( this)

}

funinit(context: Context){

valstatusBarHeight = ResourcesUtils.getStatusBarHeight(context)

Toast.makeText(context, "状态栏高度为:$statusBarHeight",Toast.LENGTH_SHORT).show()

}

}

(4)我们在看看看完整的工程结构图

四、Java项目里面集成Kotlin的module

这一部分源码请看github:https://github.com/AweiLoveAndroid/Kotlin-learn/tree/master/JavaAndKotlinDemo

(1)创建一个名为 `KotlinAndJavaDemo` 的项目创建一个module,取名为`KotlinModule`,跟普通创建一样,只是最后一步要选择使用的语言是`Kotlin`,如图所示:

(2)项目代码和平常使用Kotlin开发一样。

(3)如果我们是一个Kotlin的lib库,Java也是可以直接调用的。

我的Java的module名为app, 依赖了一个Kotlin的名为kotlinlibrary的lib。我需要在app里面使用kotlinlibrary的ResourcesUtils,然后获取状态栏高度,如果成功,就弹吐司显示状态栏高度。

这个是kotlinlibrary的ResourcesUtils:

packagecom.lzw.kotlinlibrary

importandroid.content.Context

/**

* 描述:

* 资源工具类

*/

classResourcesUtils{

// 伴生对象 这里面包裹的方法 实际上类似于java的静态方法

companionobject{

/**

* 获取状态栏高度

* @return状态栏高度

*/

fungetStatusBarHeight(context: Context): Int{

//获取status_bar_height资源的ID

valresourceId = context.resources.getIdentifier( "status_bar_height", "dimen", "android")

returnif(resourceId > 0) {

//根据资源ID获取响应的尺寸值

context.resources.getDimensionPixelSize(resourceId)

} else{

dip2px(context, 40f)

}

}

/**

* dp 转 px(像素)

*/

fundip2px(context: Context, dpValue: Float?): Int{

valscale = context.resources.displayMetrics.density

return(dpValue!! * scale + 0.5f).toInt()

}

/**

* px(像素) 的单位 转 dp

*/

funpx2dip(context: Context, pxValue: Float?): Int{

valscale = context.resources.displayMetrics.density

return(pxValue!! / scale + 0.5f).toInt()

}

}

}

再来看看app的MainActivity里面的使用:

publicclassMainActivityextendsAppCompatActivity{

@Override

protectedvoidonCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

init( this);

}

privatevoidinit(Context context){

intstatusBarHeight = ResourcesUtils.Companion.getStatusBarHeight(context);

Toast.makeText(context, "状态栏高度为:"+ statusBarHeight + "像素",Toast.LENGTH_SHORT).show();

}

}

(4)我们在看看看完整的工程结构图

五、同一个module同时使用Java和Kotlin(一)给kotlin文件单独配置文件路径

我们还是拿第一个前面的工程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写的,实例代码如下:

packagecom.lzw.kotlinandjavademo

importandroid.content.Context

importandroid.os.Bundle

importandroid.support.v7.app.AppCompatActivity

importandroid.util.Log

importandroid.widget.Toast

// 使用本包名里面的对应文件

importcom.lzw.kotlinandjavademo.util.ResourcesUtils

classMainActivity: AppCompatActivity() {

overridefunonCreate(savedInstanceState: Bundle?){

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main)

init( this)

}

funinit(context: Context){

valstatusBarHeight = ResourcesUtils.getStatusBarHeight(context)

Toast.makeText(context, "状态栏高度为:$statusBarHeight像素", Toast.LENGTH_SHORT).show()

Log.e( "tag", "状态栏高度为:$statusBarHeight像素")

}

}

工程目录结构如图所示:

(2)如果主工程是Java写的,部分是Kotlin写的。

比如Activity是Java写的,工具类是kotlin写的,实例代码如下:

packagecom.lzw.javaandkotlindemo;

importandroid.content.Context;

importandroid.os.Bundle;

importandroid.support.v7.app.AppCompatActivity;

importandroid.widget.Toast;

importcom.lzw.javaandkotlindemo.util.ResourcesUtils;

publicclassMainActivityextendsAppCompatActivity{

@Override

protectedvoidonCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

init( this);

}

privatevoidinit(Context context){

intstatusBarHeight = ResourcesUtils.Companion.getStatusBarHeight(context);

Toast.makeText(context, "状态栏高度为:"+ statusBarHeight + "像素",Toast.LENGTH_SHORT).show();

}

}

工程目录结构如图所示:

原谅地址:http://www.sohu.com/a/273947418_608959

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286056.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GitHub中watch、star、fork的作用

star 的作用是收藏,目的是方便以后查找。watch 的作用是关注,目的是等作者更新的时候,你可以收到通知。fork 的作用是参与,目的是你增加新的内容,然后 Pull Request,把你的修改和主仓库原来的内容合并。最早…

【MATLAB统计分析与应用100例】案例015:matlab读取Excel数据,进行值聚类分析

1. 聚类分析轮廓图 2. matlab完整代码 %*****计算例9.1的距离矩阵 x = [1, 2, 6, 8, 11];

C语言试题五十五之m个人的成绩存放在score数组中,请编写函数function,它的功能是:将高于平均分的人数作为函数值返回,将高于平均分的分数放在high所指定的数组中。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 m个人的成…

01超精美渐变色动态背景完整示例【CSS动效实战(纯CSS与JS动效)】

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我,若你是真心学习可以送你书籍,指导你学习,给予你目标方向的学习路线,无套路,博客为证。 本节案例如下(其他动效篇幅原因逐步讲解,欢迎三…

Liferay 用本地私服(nexus) 打包部署Portlet应用

当我们使用搭建一个nexus本地仓库,并且配置settings.xml来让应用启用这个仓库。我们使用Liferay 6.1.10的archetype来创建liferay portlet, 如下图: 当我们运行命令mvn package liferay:deploy时,会出现以下错误: [DEBUG] Using c…

.NET Core 分布式事务 CAP 发布 6.1 正式版

前言我们很高兴宣布 CAP 发布 6.1 版本正式版,在这个版本中我们主要针对目前已经发现的几个BUG进行了修复了以及添加了一些小特性。那么,接下来我们具体看一下吧。总览可能有些人还不知道 CAP 是什么,老规矩来一个简介。CAP地址:h…

【MATLAB统计分析与应用100例】案例016:matlab读取Excel数据,进行样品系统聚类分析

1. 聚类分析结果 2. matlab完整代码 (1)读取数据,并进行标准化 [X,textdata] = xlsread(examp09_02.xls); % 从Excel文件中读取数据 X = zscore(X

解决React Native报错:Error:Found unexpected optical bounds (red pixel)

问题背景 同样是在升级 gradle plugin V2.2.3 --> gradle plugin V3.0.1后,运行至打包APK期间报错: Error:found unexpected optical bounds (red pixel) on top border at x14.(错误:在X14的上边框上发现意外的光学边界&am…

C语言试题五十六之计算并输出给定整数n的所有因子(不包括1与自身)之和。规定n的值不大于1000。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 请编写函数…

webpack 入门

什么是WebPack,为什么要使用它? 为什要使用WebPack 现今的很多网页其实可以看做是功能丰富的应用,它们拥有着复杂的JavaScript代码和一大堆依赖包。为了简化开发的复杂度,前端社区涌现出了很多好的实践方法 模块化,让我…

mysql 列类型

列类型整型 tinyint,smallint,mediumint,int,bigint (可选参数unsigned ,(M,zerofill,结合使用才有意义))浮点型 float(可选参数D,M) decimal(可选参数D,M)字…

使用vsftp虚拟用户实现安全访问控制

一、ftp连接方式 1、命令连接 ftp在与用户交互时,首先打开的是TCP的21号端口,建立命令连接,这个连接会始终存在,直到用户输入bye的那一刻,才断开命令连接。 2、数据连接 1)主动连接 主动连接是基于TCP21号端…

【前端就业课 第二阶段】CSS 零基础到实战(04)定位

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我,若你是真心学习可以送你书籍,指导你学习,给予你目标方向的学习路线,无套路,博客为证。 一、定位 定位分为相对定位以及绝对定位。 相对定位可以理解为在 HTM…

Android TextView设置ClickableSpan 点击结尾空白位置也响应点击的问题

解决办法,在后边紧接着追加一个0宽度字符: builder.append("\u200b"); 相关知识: “\u200b” 为 Unicode Character ‘ZERO WIDTH SPACE’ (U200B),可用于内容标识,不占位数(宽度0&#xff0…

【MATLAB统计分析与应用100例】案例017:matlab读取Excel数据,进行变量系统聚类分析

1. 变量系统聚类分析结果 2. matlab完整代码 (1)读取数据,并转为距离向量 [X,textdata] = xlsread(examp09_03.xls); % 从Excel文件中读取数据 y = 1 -

WinForm 之 窗口最小化到托盘及右键图标显示菜单

日常开发有时候需要实现窗口最小化到系统托盘,本文就来讲讲该如何实现winfrom最小化到系统托盘,本例子基于VS2019编写。用C#开发winform桌面程序时,程序启动后,默认是显示在桌面而且在任务栏中有对应的图标。有的时候,…

C语言学习笔记--函数与指针

1. 函数类型 (1)C 语言中的函数有自己特定的类型,这个类型由返回值、参数类型和参数个数共同决定。如 int add(int i,int j)的类型为 int(int,int)。 (2)C 语言中通过 typedef 为函数类型重命名 typedef type name(parameter list);//如 typedef int f(int,int); 2. 函数指针 (…

C语言试题五十七之假定输入的字符串中只包含字母和*号。请编写函数function,它的功能是:删除字符串中所有*号。在编写函数时,不得使用c语言提供的字符串函数。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 假定输入的…

Wordpress:将图片、post等的URL转换为相对路径

2019独角兽企业重金招聘Python工程师标准>>> 例如上传一张图片,其地址是可能 http://127.0.0.1/wp-content/uploads/2015/12/1_.png, 问题是如果我们通过其他的电脑通过wordpress主机的公网IP访问这张图片时会提示找不到。 最好的处理方法是不…

MySQL数据库的优化(下)MySQL数据库的高可用架构方案

【51CTO独家特稿】如果单MySQL的优化始终还是顶不住压力时,这个时候我们就必须考虑MySQL的高可用架构(很多同学也爱说成是MySQL集群)了,目前可行的方案有:一、MySQL Cluster 优势:可用性非常高,性能非常好。每份数据至…