Android Kotiln講解

作者:XINHAO_HAN

第一版更新:2017.10

Kotiln需要下載Android Studio3.0或者Kotiln插件,百度喲~

那就開始直接入正題吧

Android Kotiln自定義變量,和普通JAVA有什么不同
//先從簡單到難吧~~~
來,看->LOOK
基本數據:

//JAVA
String string;
int age;
//Kotiln
string:String;
age:Integer;
var 表示變量,可賦值多次
val 表示常量,只能賦值一次

//如果定義的String賦值初始化值為null,必須得編譯器知道
//比如
//需要加"?"表示該項可以為空
var string:String? = null

基本數組

Array<Int>
Array<String>
Array<Byte>
//初始化String
 var string1: Array<String> = Array(10, { i -> (i * i).toString() })
//初始化Byte
 var ss: Array<Byte> = Array(10, { s -> (s * s).toByte() })
//初始化Int
var yy: Array<Int> = Array(10, { x -> (x * x) })

what?這都是啥?看不懂啊!!!,先別急
我這樣給你看

 var string1: Array<String> = Array(4, { i -> (i * i).toString() })
//拆分

//var 你定義的名稱:Array<T> = Array(數組的大小,{一個變量} ->(變量*變量).to該數組的T)

//i會一直++
//初始值 0,1,4,9,16
//i先為0    { i -> (0 * 0).toString() } = "0"
//i為1  { i -> (1 * 1).toString() } = "1"
//i為2  { i -> (2 * 2).toString() } = "4"
//i 為3  { i -> (3 * 3).toString() } = "9"
//i 為4  { i -> (4 * 4).toString() } = "16"
看懂了吧,為什么要是"1","4","9","16",那是因為這些都是字符串加了個引號嘛

你說NO,我就要像這種初始化的,我想手動初始化該怎么辦
//JAVA
private int[] arr = {1,2,3,4,5,6,7,8,9,0};

//Kotiln,有點不一樣,哈哈,就是有點不一樣
//Kotlin 也有無裝箱開銷的專門的類來表示原生類型數組: ByteArray、 ShortArray、IntArray 等等。這些類和 Array 并沒有繼承關系,但是 它們有同樣的方法屬性集。它們也都有相應的工廠方法:
var yy: IntArray = intArrayOf(10,1,2,3,4,5)

大概還有很多小數據,你還是看看官方的文檔,這塊只簡單給你說一下怎么用,能讓你快速上手

方法


//方法
 fun Palystat() {
  }
//重寫父類方法,使用override 關鍵字
 override fun palystat() {

    }
//添加參數,注意Kotlin的參數都是val常量,不可更改!
 fun palystat(string:String) {
  }
//有返回值
fun palystat(string:String):Int/*返回值的類型*/{
}
//方法不可重寫
final override fun Palystat(order: String, price: String, title: String){


    }


注意Kotlin的方法參數都是val常量,不可更改!



//Kotiln
class A:B{
}
//構造(第一種,無參)
class A:B{
    constructor(){
    }
}




//構造(第一種有參)

class A:B{
    constructor(){
    }
    constructor(string:String){

    }
}
//構造(第二種無參)
class A():B{
   
}
//構造(第二種有參)
class A(int:Int/*參數類型*/):B{
   
}

//調用父類構造
class A:B{
  constructor() : super()
}


//靜態類,object在Kotlin中代表靜態類
object A{
}

//調用父類
 constructor(context: Context?) : super(context) {
//表示Context可以為空
        initData()
    }

    constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) {
        initData()
    }

    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
        initData()
    }

//開始NEW一些東西

//NEW一個ArrayList
    var arr: ArrayList<String/*數據類型*/> = ArrayList<String>()
//new一個類,這樣,千萬不要寫個new

//錯誤
  var class:類名 = new 類名()
//正確
    var class:類名 = 類名()

//使用if for語句

var int:Int = 一個隨機數;

  if(int in 0..9){
//判斷是否在0與9之間相當于JAVA的 int <9 && int >0
            
   }


val str = "Hello Kotlin !"  
var array = arrayOf("3","d","x","gfd","w"," ","k","5","1","","h","4")  
  
for (i in array) print(i) // 數組遍歷                        結果:3dxgfdw k51h4  
println()  
for (i in array.reversed()) print(i) // 倒序                 結果:4h15k wgfdxd3  
println()  
for (i in 0..array.size-1) print(i) // .. 范圍               結果:01234567891011  
println()  
for (i in 2..2) print(i)        //  2與2之間                         結果:2  
println()  
for (i in array.size downTo 3) print(i)     //               結果:1211109876543  
println()  
for (i in array.size - 1 downTo 0 step 5) print(array[i]) // 結果:4kd  
println()  
for (i in str) print(i) // 字符串遍歷                        結果:Hello Kotlin !  
println()  
for (i in 0..str.lastIndex) print(i)                 //      結果:012345678910111213  
println()  
for (i in 0..str.length-1) print(i)                   //     結果:012345678910111213  
println() 



舉例子:
  for(i in 0..arr.size - 1){ //0與arr.size之間

      Log.e("數據",arr.get(i))

     }

定義別名

//比如你就非要object作為變量名稱使用
//如下
var object:Int=0
//這樣肯定是不行的
需要加"`"符號
var `object`:Int = 0//就OK了

//強制轉換

//A ->a
//B ->b
//現在有兩個不同的類別需要強制裝換
var b = a as b //關鍵字 as,將a類強制裝換為b類 

//使用get,set方法賦值

  private val view1: View?
        get() {
            val view = UIUtils.getView(R.layout.view_line_kd)
            return view
        }

//變量
private var int: Int = 0
        get() {
            int = 0
            return  int
        }
//set

  private var int: Int = 0
        set(v) {
            int = v
            
        }

//相當于JAVA當中的get set方法,CLASS當中的Bean

創建閉包

    data class Dean(var string: String, var a: Int)
    //相當于JAVABean
      class Dean{
              private String string;
              private int a;
                ....
      }
 data class Dean(var string: String, var a: Int  /*...更多類型*/)

一下是我做的一個流逝布局,供大家學習一下

package com.example.administrator.retrofit_test

import android.content.Context
import android.util.AttributeSet
import android.util.Log
import android.view.ViewGroup
import com.jiuhong.boyuan.utlis.UIUtils

/**
 * Created by Administrator on 2017/6/6.
 */

/*
*
*   流失布局,XINHAO_HAN
* */
class FlowLayout : ViewGroup {


    var conutSize: Int = 0

    constructor(context: Context?) : super(context)
    constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

    //測量位置
    override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
        /*
               *
               * 表示當前沒有孩子
               * */
        if (childCount == 0) {
            return
        }
        //記錄當前所有孩子的寬度
        var childWei: Int = 0
        //記錄當前多有孩子的高度
        var childHei: Int = 0
        //記錄多少行
        var cout: Int = 0

        Log.e("屏幕寬度", "" + UIUtils.getWeiSize())


        for (i in 0..childCount - 1) {
            val childAt = getChildAt(i)
            val widthMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)
            val heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)
            childAt.measure(widthMeasureSpec, heightMeasureSpec)
            //相加當前孩子的寬高度

            Log.e("測量結果", "" + childWei)
            if (childWei < UIUtils.getWeiSize()) {
                //一行大小正好方的下,放不下就放到下一行,沒毛病
                if (i == 0)
                    childAt.layout(0, (cout * childAt.measuredHeight), (childWei + childAt.measuredWidth), (cout * childAt.measuredHeight) + childAt.measuredHeight)
                else {
                    if (childWei + childAt.measuredWidth > UIUtils.getWeiSize()) {
                        //表示本行已無力吐槽,讓給下一行
                        cout++
                        //記得下一行位置記錄從0開始
                        childWei = 0
                        childAt.layout(childWei, (cout * childAt.measuredHeight), (childWei + childAt.measuredWidth), (cout * childAt.measuredHeight) + childAt.measuredHeight)
                    } else {
                        childAt.layout(childWei, (cout * childAt.measuredHeight), (childWei + childAt.measuredWidth), (cout * childAt.measuredHeight) + childAt.measuredHeight)
                    }
                }

                childWei += childAt.measuredWidth
            } else {
                //不能放下一行,需要換行

                //記錄行數
                cout++
                //重新記錄行數
                childWei = 0
            }


        }
        conutSize = cout


    }

    //測量大小,根據當前孩子View來決定自己的大小
    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {


        /*
        *
        * 表示當前沒有孩子
        * */
        if (childCount == 0) {
            return
        }
        var cout: Int = 0
        //記錄當前所有孩子的寬度
        var childWei: Int = 0
        //記錄當前多有孩子的高度
        var childHei: Int = 0


        for (i in 0..childCount - 1) {
            val childAt = getChildAt(i)
            childAt.measure(widthMeasureSpec, heightMeasureSpec)
            //相加當前孩子的寬高度
            childWei += childAt.measuredWidth
            childHei += childAt.measuredHeight
        }

        if (childWei > UIUtils.getWeiSize()) {
            childWei = UIUtils.getWeiSize()
        } else {

        }

        super.onMeasure(MeasureSpec.makeMeasureSpec(childWei, MeasureSpec.EXACTLY), heightMeasureSpec)
    }

}

案例2

package com.jiuhong.boyuan.view

import android.content.Context
import android.graphics.Color
import android.util.AttributeSet
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import android.widget.ListView
import android.widget.RelativeLayout
import android.widget.TextView
import com.jiuhong.boyuan.R
import com.jiuhong.boyuan.adapter.ListBaseAdapter
import com.jiuhong.boyuan.utlis.UIUtils

/**
 * Created by Administrator on 2017/5/27.
 */


/*
*
*  快遞自定義_快遞刷新
* */

class LineViewKD : RelativeLayout {
    private var viewX: Int = 0
    private var viewY: Int = 0
    private var mid: Int = 0
    private var arrayListMessage: ArrayList<String>? = null
    private var arrayListTime: ArrayList<String>? = null
    private var arrListBean: ArrayList<LineBean>? = ArrayList()
    private var listView_view: ListView? = null
    private var message_order_tv: TextView? = null


    constructor(context: Context?) : super(context) {
        initData()
    }

    constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) {
        initData()
    }

    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
        initData()
    }

    //初始化控件

    private val view1: View?
        get() {
            val view = UIUtils.getView(R.layout.view_line_kd)
            return view
        }



    //傳入數據 包括物流信息和物流單號
    fun setData(arrayListMessage: ArrayList<String>?, arrayListTime: ArrayList<String>?, order: String, wuliuBean: String) {


        //顯示物流詳細
        message_order_tv?.setText(UIUtils.CombinationString(wuliuBean, "(", order, ")"))
        if (arrayListMessage == null || arrayListTime == null) {
            return
        }
        this.arrayListMessage = arrayListMessage
        this.arrayListTime = arrayListTime

        if (arrayListMessage == null || arrayListTime == null) {
            throw RuntimeException("傳入數據不能為空!")
        }
        for (a in arrayListMessage.indices) {
            var lineBean: LineBean = LineBean(arrayListMessage.get(a), arrayListTime.get(a))
            arrListBean?.add(lineBean)
        }

        listView_view?.adapter = MyAdapter(arrListBean)


        //量測
        val view1: View = UIUtils.getView(R.layout.item_view_kd)
        val hei: Int = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)
        val wei: Int = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)
        view1.measure(hei, wei)
        viewX = view1.measuredWidth
        viewY = view1.measuredHeight
        val listViewHei: Int = viewY * arrayListMessage.size as Int
        val vl: LinearLayout.LayoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)
        vl.height = listViewHei
        listView_view?.layoutParams = vl


        //listView_view?.adapter = LineViewKD.MyAdapter(arrListBean)


    }

    fun initData() {
        val view = view1
        listView_view = view?.findViewById(R.id.listView_view) as ListView
        message_order_tv = view?.findViewById(R.id.message_order_tv) as TextView
        addView(view)


    }

    //轉換為目標數據
    data class LineBean(var message: String, var time: String)

    //設置Adapter
    class MyAdapter : ListBaseAdapter<LineBean> {

        constructor(list: MutableList<LineBean>?) : super(list)


        override fun initView(t: LineBean?, pos: Int, viewGroup: ViewGroup?, myViewHolder: MyViewHolder?) {
            var `this`: ThisViewHolder = myViewHolder as ThisViewHolder
            `this`.message_tv_kd?.setText(t?.message)
            `this`.time_tv_kd?.setText(t?.time)

            if (pos != 0) {
                `this`.get_stat1?.visibility = View.VISIBLE
                `this`.get_stat2?.visibility = View.GONE
                `this`.time_tv_kd?.setTextColor(Color.parseColor("#adadad"))
                `this`.message_tv_kd?.setTextColor(Color.parseColor("#adadad"))

            } else {
                `this`.get_stat1?.visibility = View.GONE
                `this`.get_stat2?.visibility = View.VISIBLE
                `this`.time_tv_kd?.setTextColor(Color.parseColor("#007dfd"))
                `this`.message_tv_kd?.setTextColor(Color.parseColor("#007dfd"))
            }
        }

        override fun getMyViewHolder(): MyViewHolder {
            return ThisViewHolder(UIUtils.getView(R.layout.item_view_kd))
        }


    }

    //設置ViewHolder
    class ThisViewHolder : ListBaseAdapter.MyViewHolder {
        var message_tv_kd: TextView? = null
        var time_tv_kd: TextView? = null
        //last
        var get_stat2: RelativeLayout? = null
        //runing
        var get_stat1: RelativeLayout? = null


        constructor(view: View?) : super(view) {
            message_tv_kd = findViewById(R.id.message_tv_kd) as TextView
            time_tv_kd = findViewById(R.id.time_tv_kd) as TextView
            get_stat2 = findViewById(R.id.get_stat2) as RelativeLayout
            get_stat1 = findViewById(R.id.get_stat1) as RelativeLayout
        }


    }


}

持續更新中

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,577評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,486評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,600評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,944評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,108評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,652評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,385評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,616評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,798評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,334評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,570評論 2 379

推薦閱讀更多精彩內容