为什么我可以使用 lambda 来定义 onDateChangedListener(一个接口),以及数据来自哪里?

问题描述 投票:0回答:1

我正在使用 DatePicker(一个小部件),并且我使用 .init() 与它 .init() 需要四件事。

open fun init( year: Int,  
   monthOfYear: Int,    
   dayOfMonth: Int,   
   onDateChangedListener: DatePicker.OnDateChangedListener! ): Unit

我可以这样编码

val datepicker = findViewById<DatePicker>(R.id.date_Picker)
val today =Calendar.getInstance()
datepicker.init(today.get(Calendar.YEAR),today.get(Calendar.MONTH),
                today.get(Calendar.DAY_OF_MONTH))
                {view,year,month,day->
                // things it do when the date is changed
                }

为什么我可以这样写?只给出一个 lambda? “观”、“年”、“月”、“日”从何而来?这个 lambda 如何读取我选择的日期并将其传递给 lambda?

android kotlin lambda android-datepicker
1个回答
0
投票

因为 Kotlin 语言在底层很聪明。 如果有一个只有一个函数的接口,您可以传入一个 lambda,并且在幕后它将生成一个从该接口派生的类,并在该单个函数中调用您的 lambda。

那么

    datepicker.init(today.get(Calendar.YEAR),today.get(Calendar.MONTH),
                today.get(Calendar.DAY_OF_MONTH))
                {view,year,month,day->
                // things it do when the date is changed
                }
    

变成:

   class MyListener: DatePicker.OnDateChangedListener {
      override fun onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
         //body of your lambda
      }
    }

   datepicker.init(today.get(Calendar.YEAR),today.get(Calendar.MONTH),
            today.get(Calendar.DAY_OF_MONTH), 
            MyListener()
    

仅当类型是具有单个函数的接口时,这才有效。 如果有两个函数,它将不知道要覆盖哪一个,因此将无法编译。

lambda 的参数只是调用 lambda 时传入的普通值。 您可以随意称呼它们,但它们的类型和数量由您正在实现的接口决定。

© www.soinside.com 2019 - 2024. All rights reserved.