Android开发之kotlin实现(体验)
虽然工作很久了但是第一次写博客,每次动手去写东西感觉自己要表述的东西网上一搜有好多(可能几篇东西凑到以前满足自己的需要),最近从Google大会了解到kotlin语言也感觉它的发展很有市场,看了官方的文档自己感觉可以试试这门语言,所以自己写了一个小的demo试试它,其中包含可Android中的基本用法,闲话不说直接开整:
- 环境的搭建
3.0以下的Android Studio版本(3.0自带kotlin插件)
目前只探索了Android Studio上使用,其实Android Studio也是基于kotlin语言开发团队开发的IDE上完善的软件开发工具
1.需要安装kotlin语言的插件File——>settings——>plugins——>搜索框中输入Kotlin——>搜索——>然后安装——>关闭重启(重启完就可以开始开发了)
- 开始我们的安卓项目
- 创建项目(和平常我们创建项目一样就可以了)
- 修改配置:创建完项目还要一点点小小的配置才能使用kotlin语言语言开发
1.项目根目录下的build.gradle 文件中添加
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.1.2-4" (1.1.2-4为kotlin版本号)
如下:
dependencies {
classpath 'com.android.tools.build:gradle:2.2.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.1.2-4" }
2.app目录下的build.gradle 文件中添加
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
和compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
添加地方如下图:
到这来我们对与kotlin的相关配置完成就可以进行代码的写了。
- 案例代码实现
- MainActivity代码实现如下
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.view.View
import com.project.lp.kotlindemo.Time.VerticalTimeLineActivity
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() ,View.OnClickListener {
private var mContext: Context? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mContext = this
//kotlin中可以直接用不用findViewById() 但是使用是需要导入import kotlinx.android.synthetic.main.activity_main.*
btn_time_line.setOnClickListener(this)
}
override fun onClick(v: View) {
// TODO Auto-generated method stub
/**
* kotlin中的when语句和java比较像但是他必须有else(像java中的default)
* 但是这个else必须有除非是枚举类型可以不用
* kotlin中的when必须是所有类型都包括 所有非枚举类型就必须要else分支
*/
when (v.id) {
R.id.btn_time_line -> {
//声明一个变量
intent = Intent(mContext, VerticalTimeLineActivity::class.java)
startActivity(intent)
}
else -> {
}
}
}
- VerticalTimeLineActivity代码实现如下
import android.app.Activity
import android.os.Bundle
import android.widget.ListView
import com.project.lp.kotlindemo.R
import java.util.*
/**
* 横向的进度显示
* @author Administrator
*/
class VerticalTimeLineActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState)
setContentView(R.layout.vertical_time_line_activity)
//声明变量 as后面是数据的类型 kotlin语言是可以省略";"号的
val listView = this.findViewById(R.id.listview) as ListView
listView.dividerHeight = 0
val timelineAdapter = TimelineAdapter(data, this)
listView.adapter= timelineAdapter
}
private val data: List<Schedule>
get() {
val list = ArrayList<Schedule>()
//kotlin语言中的循环 0..9给的是i的范围
for (i in 0..9) {
val schedule = Schedule()
schedule.context = "测试数据" + i
val dt = Date()
val time = dt.time + i * 10000
schedule.Time = time
list.add(schedule)
}
return list
}
}
- Adapter代码实现如下(之前写的一个demo直接搬过来的)
/**
*baseAdpter
*/
abstract class MyBaseAdapter<T>(protected var list: List<T>?, protected var context: Context) : BaseAdapter() {
override fun getCount(): Int {
// 重要:
if (list != null && list!!.size > 0) {
return list!!.size
} else {
return 0
}
}
override fun getItem(position: Int): T {
return list!![position]
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
}
import android.annotation.SuppressLint
import android.content.Context
import android.graphics.Color
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import com.project.lp.kotlindemo.MyBaseAdapter
import com.project.lp.kotlindemo.R
import java.text.SimpleDateFormat
import java.util.*
/**
*具体实现功能的Adpter
*/
class TimelineAdapter @SuppressLint("SimpleDateFormat")
constructor(list: List<Schedule>, context: Context) : MyBaseAdapter<Schedule>(list, context) {
private val sdf: SimpleDateFormat = SimpleDateFormat("yyyy-MM-dd hh:mm:ss")
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
var view : View
// TODO Auto-generated method stub
//感觉和java一样不
var viewHolder: ViewHolder? = null
if (convertView == null) {
val inflater = LayoutInflater.from(parent.context)
view = inflater.inflate(R.layout.listview_item, null)
}else {
view = convertView
}
viewHolder = ViewHolder.getHolder(view)
val titleStr = super.list!![position].context
if (position == 0) {
viewHolder.view_top_line.setBackgroundColor(Color
.parseColor("#00000000"))
} else {
viewHolder.view_top_line.setBackgroundColor(Color
.parseColor("#A6A6A6"))
}
if (null != super.list && super.list!!.size > 0 && position == super.list!!.size - 1) {
viewHolder.view_bottom_line.setBackgroundColor(Color
.parseColor("#00000000"))
} else {
viewHolder.view_bottom_line.setBackgroundColor(Color
.parseColor("#A6A6A6"))
}
viewHolder.title.text = titleStr
viewHolder.tv_time.text = sdf.format(Date(super.list!![position].Time))
return view
}
internal class ViewHolder(convertView: View) {
var view_top_line: View
var view_bottom_line: View
var title: TextView
var tv_time: TextView
init {
view_top_line = convertView.findViewById(R.id.view_top_line) as View
view_bottom_line = convertView
.findViewById(R.id.view_bottom_line) as View
title = convertView.findViewById(R.id.title) as TextView
tv_time = convertView.findViewById(R.id.tv_time) as TextView
}
companion object {
fun getHolder(convertView: View): ViewHolder {
var holder: ViewHolder? = null
//判空操作
if(null != convertView.tag){
//没有判空操作直接强转是如果为空就会类型错误
holder = convertView.tag as ViewHolder
}
if (holder == null) {
holder = ViewHolder(convertView)
convertView.tag = holder
}
return holder
}
}
}
}
第一次技术文档写希望对您有用,也希望您题出宝贵的建议
中文官网
demo下载连接