1、插件安装
File –> Setting –> Plugins –> Install JetBrains Plugins –> 搜索找到Kotlin并安装
安装完成后重启AS。
此时再新建类时就会多出两个选项。
2、配置kotlin
根目录下build.gradle
buildscript {
ext.kotlin_version='1.0.6'
repositories {
jcenter()
}
dependencies {
// kotlin配置
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
}
}
这里有一个注意点:就是classpath的值,因为我们使用了kotlin_version这个变量,所以不能使用单引号括起来,一定得使用双引号。
app下的build.gradle
// kotlin插件
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
ext.anko_version = '0.8.2'
sourceSets {
main.java.srcDirs += 'src/main/kotlin'//main目录下建立kotlin专用文件夹
}
dependencies{
...
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
compile "org.jetbrains.anko:anko-sdk15:$anko_version"
compile "org.jetbrains.anko:anko-support-v4:$anko_version"
}
后来发现第一行的gradle依赖的作用在于intent的地方,如下代码
val intent = Intent(this,SelectPhotoActivity::class.java)
startActivity(intent,)
这里的 .java,如果不加stdlib依赖,这里就一直报错,找不到 .java
3、运行程序
在kotlin文件夹下添加了和java下一样的package,然后在配置文件中把启动activity改成RunActivity
package com.xmliu.itravel
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_run.*
class RunActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_run)
runTV.text = "我是一个跑者"
runTV.OnClick { toast(this,"敢点我,你完蛋了") }
}
}
最终运行结果,如图所示
4、其他小技巧
实现OnClickListener接口
class KotlinAboutActivity : Activity() , View.OnClickListener{
override fun onClick(view: View?) {
when (view?.id) {
R.id.aboutus_new_layout -> startActivity(Intent(this@KotlinAboutActivity, KotlinVersionHtmlActivity::class.java))
...
...
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_about)
aboutus_new_layout.setOnClickListener(this)
}
}
使用this@KotlinAboutActivity 确认指向目标
lambda表达式,当就一个参数时,可以省略,用内部的it代替;当参数不使用时,可以用下划线_取代
实现网络请求
val result = URL("<api call urlStr>").readText()
以上一行代码在java里要写成以下一大段
public String getHttpStringWithGet(String urlStr) {
StringBuffer sb = new StringBuffer();
String line;
BufferedReader buffer = null;
try {
URL url = new URL(urlStr);
HttpURLConnection urlConn = (HttpURLConnection) url
.openConnection();
urlConn.setRequestMethod("GET");
urlConn.setUseCaches(false);
urlConn.setConnectTimeout(5000);
urlConn.setReadTimeout(50000);
urlConn.connect();
buffer = new BufferedReader(new InputStreamReader(
urlConn.getInputStream()));
while ((line = buffer.readLine()) != null) {
sb.append(line);
}
} catch (Exception e) {
e.printStackTrace();
Log.i("TAG", e.getMessage());
JSONObject obj = new JSONObject();
try {
obj.put("success", "false");
obj.put("reason", "无法连接到服务器");
} catch (JSONException e1) {
e1.printStackTrace();
}
return obj.toString();
} finally {
try {
if (buffer != null)
buffer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
onActivityResult回调
在onActivityResult回调方法中,一定要注意把Intent的参数值添加?,这意味着该值可以为空,不然在用户取消操作时,程序会崩溃;同理于适配器adapter的convertView也需要加上问号
Kotlin数值对象
如下表格
类型 | 长度 |
---|---|
Double | 64 |
Float | 32 |
Long | 64 |
Int | 32 |
Short | 16 |
Byte | 8 |
实体类javaBean
data class User(val name: String, val age: Int)
RecyclerView适配器
这是借助了封装好的基类BaseRecycerAdapter,里面封装好了点击事件
class CalendarAdapter(context: Context, list: List<*>) : BaseKotlinRecyclerViewAdapter(context, list) {
override fun onCreateViewLayoutID(viewType: Int): Int {
return R.layout.item_travel_calendar_list
}
override fun onBindViewHolder(holder: RecyclerHolder, position: Int) {
val item = list[position] as NoteBean
holder.convertView.calendar_item_content.text = item.content
}
}
如果不借助的话,就像下面这样,参考这里
class MainAdapter(var context: Context, var data: Array<String>) : RecyclerView.Adapter<MainAdapter.MyViewHolder>() {
override fun getItemCount(): Int {
return data.size
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
holder.itemView.tv_title.text = "标题:"
holder.itemView.tv_content.text = data[position]
}
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): MyViewHolder {
return MyViewHolder(LayoutInflater.from(context).inflate(R.layout.listitem_main, parent, false))
}
class MyViewHolder(itemView: View?) : RecyclerView.ViewHolder(itemView)
}
5、参考文章
- Kotlin官网 http://kotlinlang.org/
- Kotlin官方博客 https://blog.jetbrains.com/kotlin/
- GitHub官方链接 https://github.com/JetBrains/kotlin
- Kotlin在线编辑器 https://try.kotlinlang.org
- 国内为数不多的关于Kotlin的视频讲解 https://github.com/enbandari/Kotlin-Tutorials