1、写Activity

class xxxActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 设置布局
        setContentView(R.layout.xxx)
    }
}

2、Activity中 启动Activity,Context为 thisxxxActivity@this
内部类里 启动Activity,Context为 this@xxxActivity

3、指定Class字节码文件 xxxActivity::class.java

4、设置点击事件

xxxView.setOnClickListener(object : View.OnClickListener{
            override fun onClick(v: View?) {
                ...
            }
})

或者

xxxView.setOnClickListener {
    ...
}

5、安卓版本android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.xxx

6、单例

object xxxx {
 }
使用单例xxxx.INSTANCE.xxx

7、常量
private/public const val aaa = xxx

8、安卓长按图标快捷方式(25版本7.1.1后开始有)

android.content.pm.ShortcutInfo
 android.content.pm.ShortcutManager

9、xxx?.size ?: 0 '?:'意思为 问一下size为null吗,为null返回0,否则返回size值

10、继承抽象类xxx,并实现里面的param1和param2两个变量的get抽象方法,同时赋值默认值

class xxxx(override val param1: Int = R.string.filter_adjustment_noise,
 override val param2: Int = R.drawable.selector_edit_filter_noise) : xxx() {

11、抽象类和抽象方法

abstract class 抽象类 {

    abstract val 抽象成员变量: Int

    abstract fun 抽象方法()
}

interface 接口 {

    fun 接口中的方法()

    fun 接口中的实体方法() {

    }
}

class 实现类 : 抽象类(), 接口 {

    override val 抽象成员变量: Int
        get() = 3

    override fun 抽象方法() {

    }

    override fun 接口中的方法() {

    }
}

12、Standard.kt下的一些方法
run
T.run
with
T.apply
T.also
T.let
T.takeIf
T.takeUnless
repeat

13、集合的查询方法
xxxList.firstOrNull {
这里面返回一个Boolean类型,返回true表示找到了,则整个方法返回找到的元素
}

xxxList.any {
这里面返回一个Boolean类型,返回true表示找到了,则整个方法返回true,表示存在符合此条件的元素
}

xxxList.count {
这里写一个Boolean类型的判断条件,条件成立,则计数加1,最后返回符合条件的所有元素的数量
}

14、for循环中的indices(index的复数形式)

val items = listOf("apple", "banana", "kiwifruit")
for (index in items.indices) {
    println("item at $index is ${items[index]}")
}

items.indices是个装满索引数字的数组

15、when可以替代多重if else

when {
    x == 1 -> println("hello")
    x == 2 -> println("hello2")
    x == 3 -> println("hello3")
}

16、list的.map方法,是将元素逐一取出,然后逐一进行各项map中的操作,同时创建一个ArrayList,将操作后的元素放入其中,返回

17、已知三角形三边abc,求面积,
海伦公式:
p = (a+b+c)/2
面积 = 开根号(p*(p-a)(p-b)(p-c))

18、com.facebook.drawee.view.SimpleDraweeView 必须设置roundWithOverlayColor属性,即背景颜色,才能使上层圆形生效

<com.facebook.drawee.view.SimpleDraweeView
 android:id="@+id/simpleView"
 android:layout_width=“40dp”
 android:layout_height=“40dp”
 app:roundWithOverlayColor="#00000000"
 app:roundingBorderWidth=“20dp”
 app:roundAsCircle=“true”/>val color = this@MainActivity.resources.getColor(R.color.edit_font_background_selected)
 val roundingParams = simpleDraweeView.hierarchy.roundingParams
 roundingParams?.borderColor = color
 simpleDraweeView.hierarchy.roundingParams = roundingParams

19、
Class.isAssignableFrom与 instanceof 区别

isAssignableFrom 是用来判断一个类Class1和另一个类Class2是否相同或是另一个类的超类或接口。
通常调用格式是
Class1.isAssignableFrom (Class2)
调用者和参数都是 java.lang.Class 类型。

而 instanceof 是用来判断一个对象实例是否是一个类或接口的或其子类子接口的实例。
格式是: oo instanceof TypeName
第一个参数是对象实例名,第二个参数是具体的类名或接口名

20、
传统的java方式调用构造函数直接返回对象,有时候需要在构造时进行一些判断,而有可能构造对象失败,
可以这样做:

class Demo(param: String) {
 companion object {
 operator fun invoke(param: String): Demo {
 // 做一系列判断,来决定返回对象,还是null
 // 其实是障眼法,因为invoke方法本身就是括号(),让外界使用时,误以为调用的是构造方法,其实是一个名字叫invoke的方法
 if(xxx){
 return Demo()
 } else {
 return null
 }
 }
 }
 }

21、传一个回调的简单方式
a: 回调可以传null

fun get(block: ((T) -> Unit)?) {

        // do something

        block?.let {
            it(T)
        }

        // do something

}

b: 回调不可以传null

fun get(block: (T) -> Unit) {

        // do something

        block(T)

        // do something

}

22、如果代码里有一些重复的小的代码段,除了提取成方法,还可以这样写,写成成员变量的方式:

var videoWidth: Int = 0
 private set // set方法私有化,使得数据不会被改动
 get() = decoder.videoWidth

23、懒加载 by lazy

24、使用成员变量方式自定义get和set方法,起到简化代码和简单封装的效果,类似22条

var name: String = ""
        get() {
            xxx
            xxx
            return xxxx.name
        }
        set(value) {
            if (value == "123") {
                field = value
            }
        }

25、单例类
object Demo{

fun myFunc(){
    xxxx
}

}
使用:Demo.myFunc()
Java中是写static修饰的静态方法,来处理这件事,Kotlin中使用object定义一个单例类,例如我们常用的工具类

26、伴随对象companion object {} 类似Java中的静态成员方法,静态成员变量
举例:

class SecondActivity : AppCompatActivity() {
 companion object {
 fun intent(context: Context, user: String): Intent {
 val intent = Intent(context, SecondActivity::class.java)
 intent.putExtra(“user”, user)
 return intent
 }
 }
 }


使用:val intent = SecondActivity.intent(this, “xxx”)
startActivity(intent)
好处:这样做的好处,减少代码,避免少传参数,导致显示异常(因为需要传哪些参数,直接已经在方法上指明)

27、全局常量,用于全局使用的常量,一般不建议扩大常量的作用域。
3种写法:
const val USER_NAME_1 = “username”

object Demo {
const val USER_NAME_2 = “username”

object Demo01 {
    const val USER_NAME_3 = "username"
}

}
使用:
USER_NAME_1直接使用
Demo.USER_NAME_2
Demo.Demo01.USER_NAME_3

28、可选参数
b是可选参数,不传,默认为3,传即使用传递的值

fun myFunc(a: Int, b: Int = 3){
 }

29、扩展方法extentions

30、类型转换使用 as 但是如果对象为null,则会抛出异常
在不确定对象是否为null时尝试转换使用 as? 这样不会抛出异常,当然,使用这种方式,转换完的结果可能为null,所以要加问号?,例如(xxx as? xxxx)?.let{ … }