kotlin和java混合開發總結
宣告:本文是作者AWeiLoveAndroid原創,版權歸作者AWeiLoveAndroid所有,侵權必究。如若轉發,請註明作者和來源地址!未經授權,嚴禁私自轉載!
我本來是不想學習kotlin的,但是現在的形勢,很多公司都在使用kotlin開發,可以說學會kotlin也是無奈之舉,既然是潮流,谷歌也在大力推廣,所以還是隻能硬著頭皮逼迫自己學一下,也能更快適應公司的需要。正所謂:“識時務者為俊傑”,改變不了公司的發展,那就改變自己。本文首發在 ofollow,noindex">慕課網 ,轉載請註明原文連結和作者資訊。
廢話少說,直接上正題。本文主要講解kotlin和java混合開發的一個初探。這是一個入門篇的總結部落格。我這裡使用的Kotlin版本是最新的版本,版本號是 1.3.0
目錄

本文配套原始碼請看github: https://github.com/AweiLoveAndroid/Kotlin-learn/
一、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是我的電腦名。
如下圖所示:

二、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
:
/** * 描述: *資源工具類 */ 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)我們在看看看完整的工程結構圖

四、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
:
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)我們在看看看完整的工程結構圖

image
五、同一個module同時使用Java和Kotlin
(一)給kotlin檔案單獨配置檔案路徑
我們還是拿第一個前面的工程 KotlinAndJavaDemo
為例,我在module app
裡面同時使用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(); } }
工程目錄結構如圖所示:
