kotlin和java混合開發總結

AWeiLoveAndroid發表於2018-11-07

宣告:本文是作者AWeiLoveAndroid原創,版權歸作者AWeiLoveAndroid所有,侵權必究。如若轉發,請註明作者和來源地址!未經授權,嚴禁私自轉載!

我本來是不想學習kotlin的,但是現在的形勢,很多公司都在使用kotlin開發,可以說學會kotlin也是無奈之舉,既然是潮流,谷歌也在大力推廣,所以還是隻能硬著頭皮逼迫自己學一下,也能更快適應公司的需要。正所謂:“識時務者為俊傑”,改變不了公司的發展,那就改變自己。本文首發在慕課網,轉載請註明原文連結和作者資訊。

廢話少說,直接上正題。本文主要講解kotlin和java混合開發的一個初探。這是一個入門篇的總結部落格。我這裡使用的Kotlin版本是最新的版本,版本號是 1.3.0


目錄

kotlin和java混合開發總結

本文配套原始碼請看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.gradlebuildscript節點 配置kotlin版本號:

buildscript {
    ext.kotlin_version = '1.3.0'
	...
}
複製程式碼

3.在專案module的 build.gradle 的頂部新增以下程式碼:

apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
複製程式碼

4.在專案module的 build.gradledependencies 節點裡新增以下程式碼:

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和java混合開發總結

kotlin的所有jar下載的路徑為: C:/Users/Administrator/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/ Users是我的電腦名。

如下圖所示:

kotlin和java混合開發總結


二、Kotlin和Java檔案互相轉換

(1)Java轉Kotlin

  • 1.選中Java檔案,點選選單欄Code-->Convert Java File to Kotlin File ,即可把java檔案轉換成kotlin檔案。

kotlin和java混合開發總結

  • 2.點選右上角提示的 configue ,然後會出現一個彈窗。

kotlin和java混合開發總結

  • 3.設定工程裡面哪些需要配置kotlin檔案支援。比如我這裡選中的是single module,module名為kotlinlibrary。還可以選擇kotlin的編譯和執行版本號,比如我選擇的1.2.30,然後點選OK即可,如下圖所示。

kotlin和java混合開發總結

  • 4.然後我們就可以看到專案根路徑的build.gradlekotlinlibrary這個module的build.gradle都做了kotlin的配置。如圖所示:

根路徑的 build.gradle 配置:

kotlin和java混合開發總結

kotlinlibrarybuild.gradle 配置:

圖片描述

(2)Kotlin轉Java

點選選單欄Tools-->Kotlin-->Decompile Kotlin To Java 就可以了,我用的AS3.1.3,不知道為啥我的是灰色的?有人可以告訴我原因嗎?

kotlin和java混合開發總結


三、Kotlin專案裡面整合Java的module

這一部分原始碼請看github:github.com/AweiLoveAnd…

(1)建立一個名為 KotlinAndJavaDemo 的專案建立一個module,取名為JavaModule,跟普通建立一樣,只是最後一步要選擇使用的語言是Java,如圖所示:

kotlin和java混合開發總結


(2)專案程式碼和平常使用Java開發一樣。

程式碼、資原始檔、預覽圖都和平時開發是一樣的。

kotlin和java混合開發總結


(3)如果我們是一個Java的lib庫,kotlin也是可以直接呼叫的。

我的kotlin的module名為app, 依賴了一個java的名為javalibrary的lib。我需要在app裡面使用javalibraryResourcesUtils,然後獲取狀態列高度,如果成功,就彈吐司顯示狀態列高度。

這個是javalibraryResourcesUtils

/**
 * 描述:
 *  資源工具類
 */
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);
    }
}

複製程式碼

再來看看appMainActivity裡面的使用:

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

kotlin和java混合開發總結


四、Java專案裡面整合Kotlin的module

這一部分原始碼請看github:github.com/AweiLoveAnd…

(1)建立一個名為 KotlinAndJavaDemo 的專案建立一個module,取名為KotlinModule,跟普通建立一樣,只是最後一步要選擇使用的語言是Kotlin,如圖所示:

kotlin和java混合開發總結


(2)專案程式碼和平常使用Kotlin開發一樣。

kotlin和java混合開發總結


(3)如果我們是一個Kotlin的lib庫,Java也是可以直接呼叫的。

我的Java的module名為app, 依賴了一個Kotlin的名為kotlinlibrary的lib。我需要在app裡面使用kotlinlibraryResourcesUtils,然後獲取狀態列高度,如果成功,就彈吐司顯示狀態列高度。

這個是kotlinlibraryResourcesUtils

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()
        }

    }

}

複製程式碼

再來看看appMainActivity裡面的使用:

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

kotlin和java混合開發總結


五、同一個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'
    }
複製程式碼

圖示如下:

kotlin和java混合開發總結

(二)程式碼裡面的使用

(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 畫素")
    }
}
複製程式碼

工程目錄結構如圖所示:

kotlin和java混合開發總結

(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();
    }
}
複製程式碼

工程目錄結構如圖所示:

kotlin和java混合開發總結

相關文章