聲明:本文是做者AWeiLoveAndroid原創,版權歸做者AWeiLoveAndroid全部,侵權必究。如若轉發,請註明做者和來源地址!未經受權,嚴禁私自轉載!java
我原本是不想學習kotlin的,可是如今的形勢,不少公司都在使用kotlin開發,能夠說學會kotlin也是無奈之舉,既然是潮流,谷歌也在大力推廣,因此仍是隻能硬着頭皮逼迫本身學一下,也能更快適應公司的須要。正所謂:「識時務者爲俊傑」,改變不了公司的發展,那就改變本身。本文首發在慕課網,轉載請註明原文連接和做者信息。android
廢話少說,直接上正題。本文主要講解kotlin和java混合開發的一個初探。這是一個入門篇的總結博客。我這裏使用的Kotlin版本是最新的版本,版本號是 1.3.0
git
本文配套源碼請看github:github.com/AweiLoveAnd…github
build.gradle
裏面的 buildscript
節點的 dependencies
子節點 添加一行依賴:buildscript {
dependencies {
// 添加這一行依賴
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
複製代碼
build.gradle
的buildscript
節點 配置kotlin版本號:buildscript {
ext.kotlin_version = '1.3.0'
...
}
複製代碼
build.gradle
的頂部添加如下代碼:apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
複製代碼
build.gradle
的dependencies
節點裏添加如下代碼:dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
}
複製代碼
Android Studio安裝根路徑/gradle/m2repository/org/jetbrains/kotlin/kotlin-stdlib/
bash
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
app
4.這幾個依賴庫的區別:ide
依賴庫名稱 | 含義 |
---|---|
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 |
工程目錄的末尾有個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是個人電腦名。gradle
以下圖所示:
Code
-->Convert Java File to Kotlin File
,便可把java文件轉換成kotlin文件。configue
,而後會出現一個彈窗。single module
,module名爲kotlinlibrary
。還能夠選擇kotlin的編譯和運行版本號,好比我選擇的1.2.30
,而後點擊OK便可,以下圖所示。build.gradle
和kotlinlibrary
這個module的build.gradle
都作了kotlin的配置。如圖所示:根路徑的
build.gradle
配置:
kotlinlibrary
的build.gradle
配置:
點擊菜單欄Tools
-->Kotlin
-->Decompile Kotlin To Java
就能夠了,我用的AS3.1.3,不知道爲啥個人是灰色的?有人能夠告訴我緣由嗎?
這一部分源碼請看github:github.com/AweiLoveAnd…
KotlinAndJavaDemo
的項目建立一個module,取名爲JavaModule
,跟普通建立同樣,只是最後一步要選擇使用的語言是Java
,如圖所示:代碼、資源文件、預覽圖都和平時開發是同樣的。
個人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()
}
}
複製代碼
這一部分源碼請看github:github.com/AweiLoveAnd…
KotlinAndJavaDemo
的項目建立一個module,取名爲KotlinModule
,跟普通建立同樣,只是最後一步要選擇使用的語言是Kotlin
,如圖所示:個人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();
}
}
複製代碼
咱們仍是拿第一個前面的工程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寫的,實例代碼以下:
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();
}
}
複製代碼
工程目錄結構如圖所示: