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.pswp.cn/news/286056.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286056.shtml
英文地址,請注明出處:http://en.pswp.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 優勢:可用性非常高,性能非常好。每份數據至…