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
}
}
}
}
第一次技術文檔寫希望對您有用,也希望您題出寶貴的建議