#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下载连接

猜你喜欢

转载自blog.csdn.net/qq_33494480/article/details/72885530