#Android開發之kotlin實現(體驗)

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下載連接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章