作者: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
}
}
}
持續更新中