1

我試圖建立一個複雜的形式,幾乎所有的元素都是可選的。它只從一個字段和一個「添加元素」按鈕開始。當您點擊添加時,表單會顯示您可以添加到表單中的元素類型的Spinner(位置,照片,詳細註釋,除「now」之外的時間戳等)。當您選擇一個項目時,它將啓動一個Activity,並且每個項目都有一個不同關聯ActivityAndroid模式:一個微調器,其中每個項目啓動不同的活動

另外,每一種選擇都會有數據,這也將是不錯的存儲「以」 Activity莫名其妙的若干個位:

  • Spinner
  • 一個鍵,圖標和顯示名稱用於在db中存儲數據(以及傳遞給web服務)
  • 如何在原始表單上顯示結果的佈局(即照片的縮略圖,位置的緯度/經度等)

我正在考慮一組類,它們都擴展了一個抽象FormElement類,並且每個上述額外數據都有靜態元素。 (此解決方案的另一個缺點是在靜態環境中有多少疼痛Resources)。

我怎樣才能使這個儘可能乾淨和可維護?我真的不喜歡編輯五個不同的文件來爲這個表單添加一個新類型的元素。 (主要是因爲我可以保證我會想念一個和花好幾個小時追逐unbugs。)

回答

1

的一些技巧...

  1. 單元測試將防止 「unbugs」 :)

  2. 當每個Activity已從用戶獲得它需要的信息時,請撥打Activity#setResult()並使用包含您的每類數據的IntentIntent支持所有Bundle方法,因此您可以根據需要設置不同類型的數據。

  3. 爲了支持#2,請確保您使用Activity#startActivityForResult(Intent,int)啓動它,並聽取了結果Activity#onActivityResult(int,Intent)

  4. 我可能會保持可用「元素」類型的列表與SpinnerAdapter使用(例如,ArrayList<Class<? extends AbstractFormElement>>,並調用靜態方法,如.getDisplayName().getActivityClass()等,在適配器的getView()方法,以確定要顯示什麼,什麼活動推出。

    這樣一來,你的列表實際上包含的東西像{ MyPhotoElement.class, MyTextElement.class, MyDateElement.class, ...})。

  5. 由於每個元素都添加到表單中,因此將其添加到ArrayList<AbstractFormElement>中,該元素將用於支持ListView的另一個適配器。該適配器將分配自定義視圖佈局的通貨膨脹,並基於它的類型創建ViewHolder - 這將要求每個不同的AbstractFormElement將具有其自己的「視圖類型」,根據適配器。請參閱BaseAdapter#getItemViewType(int)和相關的getViewTypeCount()

    值得一提的是,這些都需要不同的視圖類型只有如果不能轉換爲其他...例如,如果你有兩個「元素」只需要在列表中顯示的文本字符串,那些可以共享「純文本」視圖類型。同樣,兩個元素只能顯示一張照片,或者可以輕鬆地將其中一個轉換爲另一個(例如,帶有標題的圖標與沒有標題的照片縮略圖),可以共享一個「圖像加標題」視圖類型。

根據以上考慮,你居然會最終不得不修改不同的文件添加一個新的類型(當然,我想從技術上,你可以讓他們都在同一個文件中,如內部類,但有真這樣做沒有好的理由),但是如果你已經正確地完成了你的接口API,並且遵循了良好的OO實踐並且實現了良好的單元測試,那麼你將大大減少查找錯誤所需的工作量 - 這僅僅是因爲大部分涉及添加新類型的東西實際上會強制編譯器錯誤,如果你做錯了。此外,一個適當的單元測試套件將能夠以編程方式添加所有可能的類型,並確保一切正常顯示,並且您應該有一個非常簡化的過程,以便於擴展性:)

聽起來像很多的工作,起初看起來可能很冗長乏味,但最終的結果實際上更具可維護性,特別是如果您的元素類型列表將會相當廣泛。

+0

這正是我一直在尋找的東西。特別是第4點。我似乎從未記得通用通配符。感謝您的其他提示。非常詳細,希望我能接受兩次。 – Plutor 2011-06-14 12:29:45