2013-09-27 100 views
0

接口名稱不以「()」結尾。Android中的View.OnClickListener用法參數

並從Android文檔中將View.OnClickListener定義爲接口。

http://developer.android.com/reference/android/view/View.OnClickListener.html

話雖如此,當我們通過「View.OnClickListener」聽者作爲參數,爲什麼我們要做的結束它「()」,如下圖所示。

.setOnClickListener(new View.OnClickListener() { 
+0

它是一個匿名的內部類。 – Raghunandan

+0

有人認爲它可能是這種情況..但仍然不明白爲什麼()被用在接口上......反正tx – UnderDog

回答

4

它的Anonymous inner class語法,使您申報,並在同一時間實例化一個類。

.setOnClickListener(new View.OnClickListener() { 

//all methods in the interface implemented here 

}); 

setOnClickListener服用由實施OnClickListener類型的對象,而不是與該接口創建一個對象,直接實現的方法在那裏。

+0

你錯過了方法和分號的右括號。 –

+0

@DanielLerps謝謝,修正了這個問題。我雖然這很明顯。 –

1

它是一種annonymous內部類

假設你有一個按鈕

button.setOnClickListener(new View.OnClickListener() { 
    @override 
    public void onClick(View v) 
    { 

    } 

}); 

http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

你也可以做

button.setOnClickListener(myclicklistener); 

    OnClickListener myclickListener = new OnClickListener() // now you know why you() 
    { 
     @Override 
     public void onClick(View v) 
     { 

    } 
    }; 

從Java文檔引用

匿名類表達式由以下部分組成:

  • 的新的運營商

  • 的接口的名稱來實現或類來擴展。

  • 括號包含構造函數的參數,就像一個 普通類實例創建表達式。注意:當你實現了一個接口
    時,沒有構造函數,所以你可以使用一個空對的圓括號,如本例所示。

  • 一個body,它是一個類聲明體。更具體地說,在 正文中,方法聲明是允許的,但聲明不是。

1

點擊監聽器是一個接口。

語法

variable.setOnClicklistener(new View.OnClickListener() 
{}) 

這是我們可以使用onClicklistener的方式。

1

因爲我們在這裏啓動匿名類。因此一個接口變成了一個作爲參數傳遞的對象。因爲你正在創建一個實現特定接口的對象

View.OnClickListener listener = new View.OnClickListener() { 

    @Override 
    public void onClick() { 
    } 
}; 
someView.setOnClickListener(listener); 
1

你不需經過做到這一點的方式。它是一個匿名內部類的構造函數調用,您可以通過後面的塊中的方法來定義它。

something.setOnClickListener(new View.OnClickListener() 
{ 
    @Override 
    public void onClick(View invoker) 
    { 
     // this is a method specified by the interface. The new Object will have this method implementation 
    } 
}); 
+0

是'invoker'與'something'是相同的(相同的參考但是被上傳)? –

相關問題