2017-04-23 125 views
1

我正在使用這個Kotlin函數。我知道我們有一個叫做mPasswordView!!.setOnEditorActionListener的函數,它的參數是TextView.OnEditorActionListener,但那是什麼?我們在參數裏面有大括號?說明這個Kotlin函數結構

mPasswordView!!.setOnEditorActionListener(TextView.OnEditorActionListener { textView, id, keyEvent -> 
    if (id == R.id.login || id == EditorInfo.IME_NULL) { 
     attemptLogin() 
     [email protected] true 
    } 
    false 
}) 
+0

好吧,我的錯誤。這不是一個功能...... –

回答

4

您示例中使用的功能是SAM constructorsetOnEditorActionListener偵聽器將OnEditorActionListener作爲其參數。此接口只有一個必須實現的方法,這使得它成爲單一抽象方法(SAM)接口。

了在Java中使用這種方法將是完整的語法:

mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
     attemptLogin(); 
     return true; 
    } 
}); 

的一到一個轉換到科特林會給你:

mPasswordView.setOnEditorActionListener(object: TextView.OnEditorActionListener{ 
    override fun onEditorAction(v: TextView?, actionId: Int, event: KeyEvent?): Boolean { 
     attemptLogin() 
     return true 
    } 
}) 

科特林,但是,讓你使用以更簡潔的語法將SAM接口作爲其參數的方法,而不是傳入lambda。這就是所謂的SAM轉換:

mPasswordView.setOnEditorActionListener { v, actionId, event -> 
    attemptLogin() 
    true 
} 

SAM轉換是自動確定哪些接口這個拉姆達對應的,但你可以通過使用一種叫做SAM構造明確指定它,這是什麼在你的示例代碼。 SAM構造函數返回一個實現給定接口的對象,並將傳遞給它的lambda傳遞給它的單個方法的實現。

mPasswordView.setOnEditorActionListener(TextView.OnEditorActionListener { v, actionId, event -> 
    attemptLogin() 
    true 
}) 

這在這種特定情況下是多餘的,因爲只有一種方法叫setOnEditorActionListener。但是,如果有多個具有相同名稱的方法,它們使用不同的接口作爲參數,則可以使用SAM構造函數指定要調用的方法的哪個重載。

Official docs about SAM conversions

+1

「@ OnEditorActionListener」需要什麼? – azizbekian

+1

該語法可用於指定在嵌套函數的情況下從哪個函數返回。看到這裏:https://kotlinlang.org/docs/reference/returns.html#return-at-labels。但我相信在這個特定情況下它實際上是多餘的。 – zsmb13

0

所以與其他詞的結構如下(我只想離開這個這裏有人需要幫助,理解它):

function_A (parameters_A { override_parameters_B -> override_function_B })  

其中overriden_function_B是對象的構造函數,稱爲parameters_A