2011-11-22 107 views
3

這是一個普遍的問題,但我會給你一個具體的例子。Android - 如何避免活動之間的重複代碼

我有一個App一堆活動。在所有的活動中,都有一個Facebook按鈕。當你點擊該按鈕時,它會將你帶到一個特定的Facebook頁面。我希望按鈕在每個頁面上的行爲都完全相同。

眼下,在每一個活動,我創建Facebook的按鈕的onClickListener(),使意向,並開始活動。每個Activity中都有相同的代碼。

什麼是一次寫這樣的代碼,並將其包含在多個活動的最佳方式是什麼?有沒有反正包括其他.java文件?

我所知道的一種解決方法是使Activity的基類CustomActivity繼續延伸,然後所有活動延伸到CustomActivity。然後把我的onClickListener()代碼放在CustomActivity。雖然我是Java新手,但我不確定這是否是最好的方法。我的一些活動已經擴展了其他自定義活動類,因此擴展可以擴展更多內容的東西可能會比較麻煩,我不知道。

UPDATE

這裏玩魔鬼代言人:可以說,我去與繼承路線和我創造一些CustomActivity,我想我的活動延長。 CustomActivity將包含一堆我需要用於所有活動的通用代碼,包括但不限於Facebook按鈕功能。當有一個活動需要使用CustomActivity中的通用代碼但該特定活動中沒有Facebook按鈕時會發生什麼?

回答

5

公共基類也許是最好的辦法。 (如果你的一些活動擴展了Activity和一些擴展的Activity子類(比如ListActivity),那麼它的效果就不那麼好了。

另一種方法是創建一個單獨的類來實現你的點擊監聽器的邏輯。不消除所有重複的代碼—每個活動還需要實例化和註冊監聽器—但邏輯適合做什麼會只需要在監聽器類寫一次。

在這兩種選擇,你可能會考慮分配屬性爲按鈕,這樣你不需要註冊一個點擊監聽器,你只需要在每個活動中實現目標方法,這對於t他基地級的方法。

UPDATE

假設你去繼承路線,你想,沒有Facebook的按鈕的活動。如果您使用的是技術,那麼你就沒有做任何事情在不同的代碼—因爲沒有按鈕將調用您的onClick方法,該方法將只是坐在那裏什麼都不做。如果您要在代碼中安裝OnClickListener,則只需在註冊偵聽器之前測試該按鈕是否存在(即findViewById()未返回null)。

+0

更新的問題 –

+0

@Jakobud - 最後回答 –

+0

有趣的做法。謝謝! –

3

好,延長東西是OOP的原則,所以我不認爲這是有子類的不止一個層次的問題。你認爲的解決方案在我看來是最好的。

0

絕對。和OOP一樣,使用繼承來獲得一些可重用性。隨着您的進步,您會發現您的活動中會有越來越多的事情需要重用 - 比FB按鈕的onClickListener更復雜 - 因此,開始構建一個好主意很好,可重用的「超級」活動,你可以繼承。

5

一般公共基類是不是最好的方法(雖然它肯定是有效的)。

這花了我(和每一個OO程序員誰「獲得」 OO我所知道的)一段時間才能真正神交,但你應該謹慎作爲,你可能可以使用繼承。每當你這樣做,你應該問自己,是否真的沒有其他方式來做到這一點。

找到的一種方法是對「is-a」測試非常嚴格 - 如果您將基本活動稱爲「Facebook活動」,您真的可以說每個孩子都是「Facebook活動」嗎?可能不會。另外,如果您決定將Twitter添加到某些頁面(但不是其他頁面),那麼您如何做到這一點?

這並不是說繼承完全是出於!一個很好的解決方案可能是擴展一個控件來啓動你的Facebook活動並將其稱爲一個Facebook按鈕 - 讓它封裝你需要做的所有連接到Facebook的東西。現在你可以通過簡單的拖拽將它添加到你想要的任何頁面上(我非常確定,安卓工具可以讓你將新的組件添加到托盤中)。它不像擴展你的活動課程那樣是「免費」的,但從長遠來看,它會讓你的壓力減少很多。

你可能不會相信我現在,我們都需要從我們自己的經驗中學習,只是記住這一點,並把它作爲你演變過來的時間來評估你的代碼。

--edit,評論response--

可以封裝你認爲你會在它自己的類中使用了很多Facebook的任何活動 - 它讓到最低限度所以你可以將它添加到任何類在一個班輪中。

在某一點上,不過,你可能會決定,它仍然是太多了樣板,我完全理解。在這一點上,你可以使用一個抽象的基本活動,就像你所建議的那樣,但我不會硬編碼它來明確處理Facebook,而是支持Facebook(也許還有其他)的行爲,並打開這些行爲如所需。如果你願意,你可以告訴它不要將facebook行爲添加到給定的屏幕,或者在Twitter中添加其中的一些。

,如果你想「標準」功能,你可以讓這個樣板最低,例如,你不應該做任何特殊,如果您希望禁用Facebook的你可能會開始你的構造:

super(DISABLE_FACEBOOK_BEHAVIOR); 

,如果你想要一個也使Twitter的,你可以使用:

super(DISABLE_FACEBOOK_BEHAVIOR, ENABLE_TWITTER_BEHAVIOR); 

與像AbstractAction(BehaviorEnum ...行爲)構造函數。

這比較靈活,你可以說每個人如果你的活動是一個「行爲支持活動」,並有良知。

當然,這是一個非常好的方法,一開始就不那麼靈活,後來在需要時重構成這樣的模式,只是在尋找導致問題的繼承模型時,不要讓它在你修復它之前弄亂你太久。

+0

你有一些好點。我最初擔心的是繼承問題,因爲當我在某個Activity中沒有Facebook按鈕時會發生什麼,但我仍然需要使用'FacebookActivity'類的其他方面...... –