赞
踩
声明:本文是作者AWeiLoveAndroid原创,版权归作者AWeiLoveAndroid所有,侵权必究。如若转发,请注明作者和来源地址!未经授权,严禁私自转载!
我本来是不想学习kotlin的,但是现在的形势,很多公司都在使用kotlin开发,可以说学会kotlin也是无奈之举,既然是潮流,谷歌也在大力推广,所以还是只能硬着头皮逼迫自己学一下,也能更快适应公司的需要。正所谓:“识时务者为俊杰”,改变不了公司的发展,那就改变自己。本文首发在 慕课网,转载请注明原文链接和作者信息。
废话少说,直接上正题。本文主要讲解kotlin和java混合开发的一个初探。这是一个入门篇的总结博客。我这里使用的Kotlin版本是最新的版本,版本号是 1.3.0
本文配套源码请看github:https://github.com/AweiLoveAndroid/Kotlin-learn/
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"
- }
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是我的电脑名。
如下图所示:
(1)Java转Kotlin
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
配置:
(2)Kotlin转Java
点击菜单栏Tools
-->Kotlin
-->Decompile Kotlin To Java
就可以了,我用的AS3.1.3,不知道为啥我的是灰色的?有人可以告诉我原因吗?
这一部分源码请看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)我们在看看看完整的工程结构图
这一部分源码请看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
我们还是拿第一个前面的工程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();
- }
- }
工程目录结构如图所示:
作者:AWeiLoveAndroid
链接:https://www.jianshu.com/p/9220227cdfb3
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。