2016-06-07 88 views

回答

3

它可以讓你重用像OnClick方法這樣的事件處理程序,View參數在你的情況下是已經觸發該方法的Button實例 - 多個Button可以有相同的OnClick處理程序,在你可以檢查的方法中的按鈕已經被觸發(如果有多個)並相應地作出反應。

其實這是非常典型的事件驅動編程,不僅在Android,但所有現代的UI編程 - iOS設備時,Windows,OS/X等

還有更多的是一點:該參數的類型是View而不是Button,因爲Button不僅對OnClick做出反應,而且對OnClick作出反應的常見類型的UI對象是View。

現在,您不僅可以以不同方式處理事件,還可以直接訪問事件的來源,以便您可以處理事件 - 在Button的示例中,您可以更改其標題,並且您肯定知道您正在更改觸發該事件的UI對象的標題。

因此,以這種方式進行事件驅動的API有很多意義。

UPDATE

一個登記的事件處理程序的方法(或在Android的世界ClickListener)被分配方法的名字到的onClick直接在佈局屬性 - 提供當然,該方法具有正確的簽名,即期望一個View類型的參數,並具有void返回類型 - 您可以在其他答案中看到一個示例。

另一種是匿名內部類指派這樣的監聽器:

findViewById(R.id.someButton).setOnClickListener(
    new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
     doSomething(); 
     } 

    }); 

您也可以實現View.OnClickListener接口的類的實例,即使是'活動」本身能做到這一點,然後將其註冊爲聽衆。

實際上它們的工作方式都是一樣的 - 在按鈕實例中有一個實現接口註冊的類的實例,按鈕(或該事件的視圖)識別其邊界內的點擊並調用偵聽器傳遞本身(this)給監聽者。

我個人認爲第三種方法是最糟糕的 - 你只能在類中有一個名字的方法,但是在佈局中有很多按鈕,所以他們都需要使用條件代碼來處理。

第一個很好,因爲您可以直觀地設置它,但考慮到它全部在XML文件中,並且您可以爲一個活動設置多個佈局,所以在較大的項目中控制它可能相當麻煩。

因此,我最喜歡的是第二個 - 它允許您將所有邏輯保留在代碼中的一個位置,例如,如果您在活動的onCreate方法中註冊了所有處理程序。

+0

非常感謝隊友我現在:) – Eddy

+0

但是我得到了最後一個問題 - 因爲onClick是一個我們用於按鈕並使用View作爲參數的方法,它意味着每當它被調用時,一個對象被傳遞給它(如果我沒有錯的話,Button類對象)。我無法理解它傳遞的對象(Button class Object)作爲參數傳遞給此方法的能否解釋我? – Eddy

+0

我不太清楚你的意思,我會試着解釋我想的 - 每個View都處理它自己的點擊事件,並調用一個註冊的監聽器方法(事件處理程序),將this傳遞給監聽器。所以它是Button本身調用你的方法並使用'this'作爲參數。 –

3

使用view參數來查找來電,看代碼:

public void buttonOnClick(View view) { 
    switch (view.getId()) { 
     case R.id.button1: 
     doSomething1(); 
     break; 
     case R.id.button2: 
     doSomething2(); 
     break; 
     } 
} 

因此,可以用同樣的方法對多個對象:

android:onClick="buttonOnClick" 
+0

感謝很多朋友我現在得到它:) – Eddy

相關問題