2013-07-09 101 views
4

我的標題道歉,我無法正確闡述問題。我看過OnCLickListener兩種方式實現。第一種是通過表示你的班級實施OnCLickListener來完成的。第二個通過讓你自己聲明它來完成任務。聲明一個類實現OnClickListener與自己聲明它?

爲什麼在第一個選項中,您可以簡單地將this作爲您的setOnCLickListener參數,但在第二個選項中,您必須經歷自己創建OnClickListener對象的麻煩?

第一:

public class WidgetConfig extends Activity implements OnClickListener { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.widgetconfig); 
    Button b = (Button)findViewById(R.id.bwidgetconfig); 
    b.setOnClickListener(this); 
    } 
    //onClick defined outside of the onCreate 
    @Override 
    public void onClick(View arg0) { 
    // TODO Auto-generated method stub 

    } 

第二:

public class WidgetConfig extends Activity{ 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.widgetconfig); 
    Button b = (Button)findViewById(R.id.bwidgetconfig); 
    b.setOnClickListener(bListener); 
} 



private Button bListener = new OnClickListener(){ 

b.setOnClickListener(new OnClickListener(){ 

      @Override 
      public void onClick(View v) { 

      //TO-DO 

      } 
}); 
+0

這個問題是無處相關的android,它涉及到你的JAVA概念 –

+0

方式#3 - 只是FYI,你也可以創建自己的自定義類,讓它實現ClickListener接口,然後創建該偵聽器的新實例。然後您可以調用:setOnClickListener(new YourCustomClass())。這是封裝處理您的點擊操作的代碼的好方法。 –

回答

4

在第一種方法中,您的整個活動類別實現了OnClickListener接口。您可以將每個視圖的OnClickListener設置爲這個,並在一種方法中接收所有的點擊事件,然後您可以過濾它們並對它們進行操作。

第二種方法使用實現接口方法的匿名內部類。通過使用這種方法,您只會收到特定視圖的事件。

在第一種方法中,您的整個班級將使用OnClickListener的一個單一實例,該實例將傳遞給您想要聽取點擊的所有視圖。

第二種方法轉化爲:

Button.OnClickListener anonymous_listener = new Button.OnClickListener() { ... }; 
button.setOnClickListener(anonymous_listener); 

這就是說,它動態地創建,當你使用它存儲新OnClickListener實例。

+0

如果整個類實現OnCLickListener,就像在第一個方法中那樣,我怎麼會爲多個按鈕設置多個onClick方法? – Richard

+0

您將不得不在重寫的方法內使用** switch **語句,並使用**視圖ID **開啓。只要查看**切換語句**爲Java,你會看到。 –

+0

明白了,謝謝 – Richard

1

我通常做的第一方式,因爲它節省的對象。但是如果你需要實現許多監聽器,那麼爲了讓代碼更加有組織和整潔,你可以考慮第二種方式。

1

案例1this代表ActivityOnClickListener類型的對象。所以,當你在b.setOnClickListener(this)中傳遞this時,它代表'OnClickListener'類型的對象。

案例2您通過anonymous object類型OnClickListener。因爲,OnClickListenerinterface您必須在匿名對象內定義方法onClick

1

如果您的onClickListener需要訪問(大部分)方法和成員變量的類,那麼可以採用第一種方法來簡化代碼。另外,如果您想要以相同的方式處理所有「onClick」,則可能會首選。

否則,當你有很多按鈕(或其他類型的視圖需要點擊處理)時,應該採取第二種選擇,並且所有這些都需要以不同的方式處理。在這種情況下,將一個按鈕(視圖)的活動處理onClick沒有任何意義,其餘部分由個人onClickListener處理,因爲這會使代碼看起來不一致。

1

您的WidgetConfig類「是一個」活動,因爲它擴展了活動。但是,您的WidgetConfig類「(也)是」OnClickListener,因爲它實現了接口。因此,當setOnClickListener()要求您作爲參數傳入點擊監聽器時,您可以傳遞「this」,因爲「this」(它是WidgetConfig)「是」onClickListener

使用匿名內部類,您可以將設置和回調功能集於一身。你應該閱讀這個,但是,關於使用這樣的類的潛在隱患:When exactly is it leak safe to use (anonymous) inner classes?