kotlin和java混合開發(fā)總結(jié)

聲明:本文是作者AWeiLoveAndroid原創(chuàng)汪疮,版權(quán)歸作者AWeiLoveAndroid所有峭火,侵權(quán)必究毁习。如若轉(zhuǎn)發(fā),請(qǐng)注明作者和來(lái)源地址躲胳!未經(jīng)授權(quán)蜓洪,嚴(yán)禁私自轉(zhuǎn)載!

我本來(lái)是不想學(xué)習(xí)kotlin的坯苹,但是現(xiàn)在的形勢(shì),很多公司都在使用kotlin開發(fā)摇天,可以說(shuō)學(xué)會(huì)kotlin也是無(wú)奈之舉粹湃,既然是潮流,谷歌也在大力推廣泉坐,所以還是只能硬著頭皮逼迫自己學(xué)一下为鳄,也能更快適應(yīng)公司的需要。正所謂:“識(shí)時(shí)務(wù)者為俊杰”腕让,改變不了公司的發(fā)展孤钦,那就改變自己。本文首發(fā)在 慕課網(wǎng)纯丸,轉(zhuǎn)載請(qǐng)注明原文鏈接和作者信息偏形。

廢話少說(shuō),直接上正題觉鼻。本文主要講解kotlin和java混合開發(fā)的一個(gè)初探俊扭。這是一個(gè)入門篇的總結(jié)博客。我這里使用的Kotlin版本是最新的版本坠陈,版本號(hào)是 1.3.0


目錄

本文配套源碼請(qǐng)看github:https://github.com/AweiLoveAndroid/Kotlin-learn/

一萨惑、Kotlin集成步驟和注意事項(xiàng)(基于Kotlin1.3.0):

1.在工程根目錄的 build.gradle 里面的 buildscript 節(jié)點(diǎn)的 dependencies 子節(jié)點(diǎn) 添加一行依賴:

buildscript {
    dependencies {
        // 添加這一行依賴
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

2.在工程根目錄 build.gradlebuildscript節(jié)點(diǎn) 配置kotlin版本號(hào):

buildscript {
    ext.kotlin_version = '1.3.0'
    ...
}

3.在項(xiàng)目module的 build.gradle 的頂部添加以下代碼:

apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

4.在項(xiàng)目module的 build.gradledependencies 節(jié)點(diǎn)里添加以下代碼:

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
}

5.注意事項(xiàng):

1.本地kotlin版本路徑:

Android Studio安裝根路徑/gradle/m2repository/org/jetbrains/kotlin/kotlin-stdlib/

2.不同了版本的依賴庫(kù)

    1.2.0以前使用這個(gè)依賴庫(kù)
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
    1.2.0+版本使用這個(gè)依賴庫(kù)
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"

3.Tools --> kotlin --> Decompiler Kotlin to Java,如果該選項(xiàng)是灰色仇矾,請(qǐng)下載插件 Java Bytecode Decompiler

4.這幾個(gè)依賴庫(kù)的區(qū)別:

依賴庫(kù)名稱 含義
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下載到本地的路徑在哪里?

工程目錄的末尾有個(gè)External Libraries粗合,選擇某一個(gè)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文件互相轉(zhuǎn)換

(1)Java轉(zhuǎn)Kotlin

  • 1.選中Java文件行冰,點(diǎn)擊菜單欄Code-->Convert Java File to Kotlin File 溺蕉,即可把java文件轉(zhuǎn)換成kotlin文件。
  • 2.點(diǎn)擊右上角提示的 configue 悼做,然后會(huì)出現(xiàn)一個(gè)彈窗疯特。
  • 3.設(shè)置工程里面哪些需要配置kotlin文件支持。比如我這里選中的是single module肛走,module名為kotlinlibrary漓雅。還可以選擇kotlin的編譯和運(yùn)行版本號(hào),比如我選擇的1.2.30朽色,然后點(diǎn)擊OK即可邻吞,如下圖所示。
  • 4.然后我們就可以看到項(xiàng)目根路徑的build.gradlekotlinlibrary這個(gè)module的build.gradle都做了kotlin的配置葫男。如圖所示:

根路徑的 build.gradle 配置:

kotlinlibrarybuild.gradle 配置:

(2)Kotlin轉(zhuǎn)Java

點(diǎn)擊菜單欄Tools-->Kotlin-->Decompile Kotlin To Java 就可以了抱冷,我用的AS3.1.3,不知道為啥我的是灰色的梢褐?有人可以告訴我原因嗎旺遮?


三、Kotlin項(xiàng)目里面集成Java的module

這一部分源碼請(qǐng)看github:https://github.com/AweiLoveAndroid/Kotlin-learn/tree/master/KotlinAndJavaDemo

(1)創(chuàng)建一個(gè)名為 KotlinAndJavaDemo 的項(xiàng)目創(chuàng)建一個(gè)module,取名為JavaModule盈咳,跟普通創(chuàng)建一樣耿眉,只是最后一步要選擇使用的語(yǔ)言是Java,如圖所示:


(2)項(xiàng)目代碼和平常使用Java開發(fā)一樣猪贪。

代碼跷敬、資源文件、預(yù)覽圖都和平時(shí)開發(fā)是一樣的热押。


(3)如果我們是一個(gè)Java的lib庫(kù)西傀,kotlin也是可以直接調(diào)用的。

我的kotlin的module名為app桶癣, 依賴了一個(gè)java的名為javalibrary的lib患雇。我需要在app里面使用javalibraryResourcesUtils伸刃,然后獲取狀態(tài)欄高度,如果成功,就彈吐司顯示狀態(tài)欄高度鹅颊。

這個(gè)是javalibraryResourcesUtils

/**
 * 描述:
 *  資源工具類
 */
public class ResourcesUtils {
    /**
     * 獲取狀態(tài)欄高度
     * @return 狀態(tài)欄高度
     */
    public static int getStatusBarHeight(Context context) {
        //獲取status_bar_height資源的ID
        int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            //根據(jù)資源ID獲取響應(yīng)的尺寸值
            return context.getResources().getDimensionPixelSize(resourceId);
        } else {
            return dip2px(context,24f);
        }
    }

    // dp 轉(zhuǎn)成 px
    private static int dip2px(Context context, Float dpValue) {
        float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }
}

再來(lái)看看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, "狀態(tài)欄高度為:$statusBarHeight",Toast.LENGTH_SHORT).show()
    }
}

(4)我們?cè)诳纯纯赐暾墓こ探Y(jié)構(gòu)圖


四芳绩、Java項(xiàng)目里面集成Kotlin的module

這一部分源碼請(qǐng)看github:https://github.com/AweiLoveAndroid/Kotlin-learn/tree/master/JavaAndKotlinDemo

(1)創(chuàng)建一個(gè)名為 KotlinAndJavaDemo 的項(xiàng)目創(chuàng)建一個(gè)module,取名為KotlinModule极舔,跟普通創(chuàng)建一樣涵亏,只是最后一步要選擇使用的語(yǔ)言是Kotlin,如圖所示:


(2)項(xiàng)目代碼和平常使用Kotlin開發(fā)一樣惹挟。


(3)如果我們是一個(gè)Kotlin的lib庫(kù)茄螃,Java也是可以直接調(diào)用的。

我的Java的module名為app连锯, 依賴了一個(gè)Kotlin的名為kotlinlibrary的lib归苍。我需要在app里面使用kotlinlibraryResourcesUtils用狱,然后獲取狀態(tài)欄高度,如果成功拼弃,就彈吐司顯示狀態(tài)欄高度夏伊。

這個(gè)是kotlinlibraryResourcesUtils

package com.lzw.kotlinlibrary

import android.content.Context

/**
 * 描述:
 * 資源工具類
 */
class ResourcesUtils {

    // 伴生對(duì)象   這里面包裹的方法  實(shí)際上類似于java的靜態(tài)方法
    companion object {
        /**
         * 獲取狀態(tài)欄高度
         * @return 狀態(tài)欄高度
         */
        fun getStatusBarHeight(context: Context): Int {
            //獲取status_bar_height資源的ID
            val resourceId = context.resources.getIdentifier("status_bar_height", "dimen", "android")
            return if (resourceId > 0) {
                //根據(jù)資源ID獲取響應(yīng)的尺寸值
                context.resources.getDimensionPixelSize(resourceId)
            } else {
                dip2px(context, 40f)
            }
        }

        /**
         * dp 轉(zhuǎn) px(像素)
         */
        fun dip2px(context: Context, dpValue: Float?): Int {
            val scale = context.resources.displayMetrics.density
            return (dpValue!! * scale + 0.5f).toInt()
        }

        /**
         * px(像素) 的單位 轉(zhuǎn) dp
         */
        fun px2dip(context: Context, pxValue: Float?): Int {
            val scale = context.resources.displayMetrics.density
            return (pxValue!! / scale + 0.5f).toInt()
        }

    }

}

再來(lái)看看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, "狀態(tài)欄高度為:" + statusBarHeight + "像素",Toast.LENGTH_SHORT).show();
    }
}

(4)我們?cè)诳纯纯赐暾墓こ探Y(jié)構(gòu)圖

image

五、同一個(gè)module同時(shí)使用Java和Kotlin

(一)給kotlin文件單獨(dú)配置文件路徑

我們還是拿第一個(gè)前面的工程KotlinAndJavaDemo為例吻氧,我在moduleapp里面同時(shí)使用kotlin和java兩種語(yǔ)言做開發(fā)溺忧。 為了便于區(qū)分,需要在該module的build.gradle文件做配置盯孙。

默認(rèn)情況砸狞,Kotlin文件存放在src/main/java/文件夾下。若是需要隔開java文件和Kotlin文件镀梭,我們可以指定一個(gè)專門存放Kotlin文件的文件夾, 首先在src/main目錄下創(chuàng)建文件夾kotlin,然后做以下配置:

android {
    // 配置一個(gè)路徑專門存放kotlin文件
    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }

圖示如下:

(二)代碼里面的使用

(1)如果主工程是kotlin寫的踱启,部分是Java寫的报账。

比如Activity是kotlin寫的,工具類是java寫的埠偿,實(shí)例代碼如下:

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

// 使用本包名里面的對(duì)應(yīng)文件
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, "狀態(tài)欄高度為:$statusBarHeight 像素", Toast.LENGTH_SHORT).show()
        Log.e("tag", "狀態(tài)欄高度為:$statusBarHeight 像素")
    }
}

工程目錄結(jié)構(gòu)如圖所示:

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

比如Activity是Java寫的冠蒋,工具類是kotlin寫的羽圃,實(shí)例代碼如下:

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, "狀態(tài)欄高度為:" + statusBarHeight + "像素",Toast.LENGTH_SHORT).show();
    }
}

工程目錄結(jié)構(gòu)如圖所示:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市抖剿,隨后出現(xiàn)的幾起案子朽寞,更是在濱河造成了極大的恐慌,老刑警劉巖斩郎,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脑融,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡缩宜,警方通過(guò)查閱死者的電腦和手機(jī)肘迎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)锻煌,“玉大人妓布,你說(shuō)我怎么就攤上這事∷挝啵” “怎么了匣沼?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)肛著。 經(jīng)常有香客問(wèn)我圆兵,道長(zhǎng),這世上最難降的妖魔是什么枢贿? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮局荚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘耀态。我一直安慰自己轮傍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布创夜。 她就那樣靜靜地躺著,像睡著了一般仙逻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上系奉,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天檬贰,我揣著相機(jī)與錄音缺亮,去河邊找鬼。 笑死萌踱,一個(gè)胖子當(dāng)著我的面吹牛葵礼,可吹牛的內(nèi)容都是我干的虫蝶。 我是一名探鬼主播章咧,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼能真!你這毒婦竟也來(lái)了赁严?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤粉铐,失蹤者是張志新(化名)和其女友劉穎疼约,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝙泼,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡程剥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片织鲸。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡舔腾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出搂擦,到底是詐尸還是另有隱情稳诚,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布瀑踢,位于F島的核電站扳还,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏橱夭。R本人自食惡果不足惜氨距,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望棘劣。 院中可真熱鬧俏让,春花似錦、人聲如沸茬暇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)而钞。三九已至,卻和暖如春拘荡,著一層夾襖步出監(jiān)牢的瞬間臼节,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工珊皿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留网缝,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓蟋定,卻偏偏與公主長(zhǎng)得像粉臊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子驶兜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容