声明:本文是做者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();
}
}
复制代码
工程目录结构如图所示: