2013-01-17 22 views
0

我已閱讀了許多關於如何使用onClickListener創建和處理按鈕點擊的主題。但是,我找不到解決此問題的任何內容。將函數添加到派生類中的onClickListener

我有一個類myActivity,我想創建第二個類myExtendedActivity,它通過添加一些額外的功能來擴展myActivity。 類myActivity包含很多代碼,這些代碼出於可維護性的原因,我不想重複。具有一些額外功能的myExtendedActivity應該像myActivity一樣運行。

特別是在myActivity的onCreate方法中,我有以下代碼將onClickListener添加到my_button。擴展活動應該只是將一個調用附加到myExtraMethod。

myButton = (Button)findViewById(R.id.my_button); 
myButton.setOnClickListener(new View.OnClickListener() 
{ 
    public void onClick(View v) 
    { 
     [...] //a lot of code here 

     myExtraMethod(); 

    } 
}); 

注意myExtraMethod只需廣播一個意圖,它是不會受到監聽器代碼的任何其他部分。

我想要做的是在myExtendedActivity中擴展OnClickListener,以便它首先執行爲myActivity編寫的代碼,而不是在myExtendedActivity中定義的myExtraMethod。

我不想修改myActivity,如果myExtendedActivity包含在項目中,它應該完全不知道。

非常感謝您

+0

在你的超類提取物,在執行的代碼onClick方法在一個單獨的方法。之後,你可以在你的子類中使用super.yourMethod()來調用這個超類的方法。 – RoflcoptrException

回答

0

如果我明白你的問題吧,解決方案可能是這樣的:

在你的佈局按鈕,您從XML定義onClickListener:

<Button 
     android:id="@+id/myButton" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:onClick="handleButtonClick" 
    /> 

然後,在MyActivity中實現方法:

public void handleClick(View view) { 

} 

而我ñMyExtendedActivity你重寫它:

public class MyExtendedActivity extends MyActivity { 
    @Override 
    public void handleClick(View view) { 
     super.handleClick(view); 
     //your code goes here 

    } 
} 
0

不修改myActivity,你不能因爲你實例化一個匿名類和子類有沒有辦法「鉤住」匿名類。

如果你可以修改myActivity,那麼你可以做匿名類從myButton.setOnClickListener(...)靜態類,並在子類來擴展監聽器類調用super.onClick(v),其次是你所期望的功能。

然後添加一個方法以獲得正確的聽衆

myButton.setOnClickListener(createMyButtonsListener()) 

,然後可以在子類中提供的擴展版本覆蓋。

或者,添加一個可以在子類中重寫的方法(即myExtraMethod())。這是在你的匿名類中調用的。

1

完全沒有修改myActivity幾乎是不可能的。

你可以使用在MyActivity像這樣(的Template method pattern的一些變體):

onCreate() { 
    myButton.setOnClickListener(new View.OnClickListener() 
    { 
     public void onClick(View v) 
     { 
      myMethod(); 
     } 
    }); 

} 

protected void myMethod() { 
    [...] //a lot of code here 
} 

然後在MyExtendedActivty

@Override 
protected void myMethod() { 
    super.myMethod(); 
    myExtraMethod(); 
} 
+0

Alex DiCarlo爲監聽器使用獨特類的解決方案也是一個不錯的解決方案。 – deekay

+0

這是更清潔,因爲你只玩1次覆蓋,它只需要最少的變化。 +1 –

+1

非常感謝,我相信這可以解決我的問題。 當我說我不想修改myActivity時,我的意思是我不想包含任何明確提到myExtendedActivity的代碼。但是在將偵聽器中的所有代碼移動到單獨的方法並覆蓋它時,我沒有任何問題。對不起,誤導性的句子。 – Piero