我在Android Studio的一個按鈕上設置了一個事件監聽器,用於更改TextView
中的文本,並且來到這裏我們定義了OnClick
方法。在其參數列表中要求提供View
對象。任何人都可以解釋它做了什麼?我不明白View
課程的目標將被用於何處。爲什麼我們必須在onClick方法中添加'查看'作爲參數,以及它做了什麼?
回答
它可以讓你重用像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
方法中註冊了所有處理程序。
使用view
參數來查找來電,看代碼:
public void buttonOnClick(View view) {
switch (view.getId()) {
case R.id.button1:
doSomething1();
break;
case R.id.button2:
doSomething2();
break;
}
}
因此,可以用同樣的方法對多個對象:
android:onClick="buttonOnClick"
感謝很多朋友我現在得到它:) – Eddy
- 1. 爲什麼我們必須命名接口方法參數?
- 2. 'dump'方法在android.location.Location中做了什麼以及它爲什麼沒有文檔?
- 3. 何時以及爲什麼我們必須實現Comparable接口?
- 4. 爲什麼我們必須綜合?
- 5. 爲什麼在主要方法中必須提及「String args []」,如果我們輸出args [],爲什麼我們要把它作爲輸出:「[Ljava.lang.String; @ 174e5edb」?
- 6. 爲什麼我們必須在'INSERT ALL'之後做出SELECT?
- 7. 爲什麼我們必須提供boost :: get的參數類型?
- 8. 爲什麼@synthetize必須手動添加?
- 9. 爲什麼我們必須爲每個操作方法調用await _userManager.GetUserAsync(User)?
- 10. 外鍵 - 他們爲我做了什麼?
- 11. 什麼是Ext.Component.initialConfig,它做了什麼,以及在什麼情況下使用它?
- 12. 在tomcat中,什麼是catalina_home以及我們爲什麼使用它?
- 13. Castle Windsor解決方法:爲什麼傳遞參數?他們是爲了什麼?
- 14. 何時以及爲什麼我必須關閉管道?
- 15. asm(「pause」)做什麼以及爲什麼要使用它
- 16. WOFF字體,它們是什麼以及爲什麼要關心?
- 17. 什麼是armeabi以及他們爲什麼使用它
- 18. 爲什麼在我可以在onCreate和onClick方法中使用它之前,必須聲明「Integer int1」?
- 19. 爲什麼我必須在Resize()方法中初始化球? --Libgdx
- 20. 爲什麼我的方法看不到傳遞給它們的參數?
- 21. 爲什麼我們必須爲@SuppressWarnings(「unchecked」)使用中間變量?
- 22. 爲什麼我必須明確地將參數向下轉換爲方法?
- 23. SHA256withRSA它做了什麼以及按什麼順序?
- 24. 爲什麼我們在onClick事件中使用綁定方法
- 25. 爲什麼我們需要一個方法中的參數(如果它涉及到給定參數),我的意思是參數是做什麼的?
- 26. 爲什麼我們必須在foo.call(this,param1,param2)中傳遞「this」參數?
- 27. WindProc爲我做了什麼?
- 28. sbcl/CLOS爲什麼我必須在此添加「驗證超類」 - 方法?
- 29. 爲什麼我們必須避免使用conio.h?它過時了嗎?
- 30. 查看邊框顏色:爲什麼我必須通過'圖層'
非常感謝隊友我現在:) – Eddy
但是我得到了最後一個問題 - 因爲onClick是一個我們用於按鈕並使用View作爲參數的方法,它意味着每當它被調用時,一個對象被傳遞給它(如果我沒有錯的話,Button類對象)。我無法理解它傳遞的對象(Button class Object)作爲參數傳遞給此方法的能否解釋我? – Eddy
我不太清楚你的意思,我會試着解釋我想的 - 每個View都處理它自己的點擊事件,並調用一個註冊的監聽器方法(事件處理程序),將this傳遞給監聽器。所以它是Button本身調用你的方法並使用'this'作爲參數。 –