kotlin学习笔记

Kotlin 基础

1. 条件表达式

1
2
3
4
5
6
7
val answerString = when {
    count == 42 -> "I have the answer."
    count > 35 -> "The answer is close."
    else -> "The answer eludes me."
}

println(answerString)

2. lambda表达式语法

<变量> = { <传入参数> -> <返回值> }

1
2
3
val sum: (Int, Int) -> Int = { x: Int, y: Int -> x + y }
// 简化后如下
val sum = { x: Int, y: Int -> x + y }

3.匿名函数

1
2
3
4
5
6
7
// 声明
val Func: (String) -> Int = { input ->
    input.length
}

// 调用
val len: Int = Func("Android")

4. 高阶函数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// 函数作为参数传入
val Func1(str: String, Func2:(String)->Int): Int{
    return Func2(str)
}

// 调用
Func1("kotlin", { input -> input.length })

// 若匿名函数是最后一个参数,则可以简化为:
Func1("kotlin"){ input -> 
    input.length
}

5. 伴生对象

相当于static关键字

1
2
3
4
5
6
7
class LoginFragment: Fragment(){
    // ...
    companion object{
        private val num: Int = 10
        private const val TAG = "LoginFragment"
    }
}

6. 属性委托

1
2
// viewModels 可检索当前 Fragment 的 ViewModel
private val viewModel: LoginViewModel by viewModels()

7. !!!?

String! 可以表示 StringString?

!!表示左侧的变量为非空,如:

1
2
val account = Account("name", "type")
val accountName = account.name!!.trim()

8. lateinit

通过 lateinit 关键字,可以避免在构建对象时初始化属性

如将下面代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class LoginFragment : Fragment() {
    private var statusTextView: TextView? = null    // 最好使用lateinit

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)

            statusTextView = view.findViewById(R.id.status_text_view)
            statusTextView?.setText(R.string.auth_failed)
    }
}

改为:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class LoginFragment : Fragment() {
    private lateinit var statusTextView: TextView

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)

            statusTextView = view.findViewById(R.id.status_text_view)
            statusTextView.setText(R.string.auth_failed)
    }
}

9. 数据双向绑定——DataBinding和ViewBinding

ViewBindingDataBinding性能要更好,这里介绍ViewBinding的用法:

1. build.gradle中添加支持

1
2
3
4
5
android {
    buildFeatures {
        viewBinding true
    }
}

2. Activity中使用

使用前:

1
2
3
4
5
6
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

使用后:

1
2
3
4
5
6
7
8
9
class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding   // 声明私有变量

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)   // 使用inflate()获取实例
        setContentView(binding.root)    // 设置视图
    }
}

3. Fragment中使用

使用前:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
class FirstFragment : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_first, container, false)
    }

}

使用后:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
class FirstFragment : Fragment() {
    private var _binding: FragmentFirstBinding? = null
    private val binding get() = _binding!!  // 获取_binging的非 null 实例

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        _binding = FragmentFirstBinding.inflate(inflater, container, false)
        return binding.root // 返回视图
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }

}

参考博客:

在 Android 中使用 ViewBinding

DataBinding和ViewBinding

10. Obsever

一个被观察者(夜)和多个观察者(十大家族、帕格、吉黑德、昆等)的依赖关系,当被观察者发生变化时,通知所有观察者发生改变

11. Fragment的生命周期


最后更新: July 16, 2022 10:57:39