2012-03-14 51 views
5

我到Android初學者,而聽者設定的onclick到一個按鈕,什麼是參數傳遞的意思是:的Android setOnclicklistener參數

btn1.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

     } 
    });  

所以,「新OnClickListener()」,它被傳遞給方法那麼不應該是一個對象?
如果它不是一個對象;那麼我們如何使用「新」關鍵字?
爲什麼不使用「this」關鍵字或其類名稱直接調用「onclick()」。

+0

嗨ODO我們傳遞一個對象作爲基本上,我們正在創建覆蓋onClick方法的內部類。 – 2012-03-14 10:15:58

回答

0

OnClickListener()

是一個接口。使用new關鍵字,您將聲明一個將實現接口的匿名內部類的新對象。這的基地問題進行

的Java

比Android。你應該考慮閱讀

Java接口

12

OnClickListenerinterface和使用new OnClickListener()作爲參數btn1.setOnClickListener它實際上是創建一個Anonymous Inner Class它實現OnClickListener 。並且方法onClick必須需要聲明,因爲它是該接口類中的抽象方法。您在onClick內寫入的任何代碼將在按下按鈕時執行。


更新

做,在一個對象使用匿名內部類:

//declaring OnClickListener as an object 
private OnClickListener btnClick = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 

    } 
}; 

//passing listener object to button 
btn1.setOnClickListener(btnClick); 

做到這一點,而無需使用匿名類:

public class YourActivity extends Activity implements OnClickListener { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     Button b = new Button(this); 

     //setting listener to button 
     b.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 

    } 
} 

唯一的區別這些方法之間是,如果你的按鈕包含點擊事件代碼應該只對該按鈕有效/可用,那麼您可以像在代碼中一樣使用內部類(因爲它很容易立即執行)。但是,如果有多個按鈕需要在onClick事件上執行相同的代碼,則可以將偵聽器定義爲對象並將其傳遞給它們。

+0

有什麼方法可以添加除匿名類以外的其他偵聽器嗎?我可以在方法簽名外聲明它,只傳遞該對象嗎?請給我代碼示例。 – 2012-03-14 10:24:26

+0

是的,當然。檢查我更新的答案 – waqaslam 2012-03-14 10:27:13

+0

還是,一個匿名的內部類:) – 2012-03-14 11:15:34

0

OnClickListener是一個接口。這意味着如果您將它設置爲內聯,則您創建了一個匿名類,它只是在set方法內實現接口。

如果你想創建一個OnClick類。你會做這樣的事情:

class OnButtonClick implements OnClickListener{ 

    public void onClick(View v) { 
     // TODO Auto-generated method stub 
    } 

} 

然後你可以使用:

OnButtonClick obc = new OnButtonClick(); 
textView.setOnClickListener(obc); 

這是比Android更多的Java,閱讀關於接口和內部類

1

接口定義回調是在單擊視圖時調用。

abstract void onClick(View v) 單擊視圖時調用。

2

要實例化一個接口或抽象類的對象,您需要覆蓋所有未實現的方法(抽象方法)。您可以通過使用匿名類或定義擴展抽象類/實現接口並覆蓋抽象方法的類來覆蓋抽象方法。然而,以使其更清晰,你可以做這樣的:

OnClickListener l = new OnClickListener() 
{ 
    @Override 
    public void onClick(View v) 
    { 
     // TODO Auto-generated method stub 
    } 
}); 
btn1.setOnClickListener(l); 

,並使用一個單獨的類,你可以做這樣的:

btn1.setOnClickListener(new MyOwnListener()); 

// ... 

public class MyOwnListener implements OnClickListener 
{ 
    // ... 

    @Override 
    public void onClick(View v) 
    { 
     // TODO Auto-generated method stub 
    } 
} 
相關問題