Android 復雜界面開發實踐之 ViewController: 前言
首先說明的是 ViewControler 并不是 Android 中存在的一個組件,而是在技術實踐中總結創造出的一個開發理念,這是一種業務開發過程中的 UI 模塊化思想的體現,依附于現成的 Activity 或者 Fragment 而存在。在特定的場景下使用 ViewControler ,會使你原本復雜的界面開發邏輯變得清晰明了,易于維護。下面進入正題。
場景介紹
先簡單介紹一種常見的界面開發情形。
示例
在我們日常 Android 開發過程中經常會看到類似下面這樣的 UI 界面。如下,這是一個普通的房屋詳情頁面。

一個簡單的房屋詳情示意界面 在實際的開發中,這種看上去長長的詳情界面比比皆是,上面只是自己簡單用畫圖板畫的一個房屋詳情示意界面。
簡單介紹下這個界面。如圖所示,最上面是一個用于展示房屋圖片的畫廊區域,下面是房屋基本信息展示塊,下面是房屋最近幾月的價格走勢圖,下面是房屋評論,實際開發中,下面可能還會有各種各樣的功能模塊,如戶型區域之類的。
總之,一般的詳情頁大都很長,而且頁面里可能會有各種各樣的 View 元素,上面的示意圖還好,整體就是四個 View 塊,還不算太多,但是實際開發中,我們拿到的設計圖可能比這長多了。
從產品角度詳情頁就是這樣,大而全,用戶就是要看到最詳盡的信息展示,但是具體到編碼實現時,我不知道大家遇到這樣的頁面后會怎么編碼實現。
其實在寫這篇文章時,我特別想知道大家在實際開發這樣的長頁面時會采用什么樣的方式去開發,如果你有自己獨特的實踐方法,歡迎在評論區評論。 一般做法 通常,按照一般的想法,盡管這個頁面比較長,但它依舊是一個普通的不能再普通的 Activity 或者 Fragment,具體要開發這樣的界面,先寫好 Layout 文件,然后在 Activity 中初始化 View、接著處理業務邏輯。
問題
對于上面說到的一般做法,應對實際開發中 80% 的界面開發都沒有特別大什么問題,但是,如果是上面提到的詳情界面開發,就會有如下的問題。
由于這個界面比較長,我們在寫 layout 時可能就會發現一個問題,layout文件太復雜了,如果界面布局比較簡單還好,但是只要復雜點,這個layout 就會變得異常復雜,相信對大多數開發人員都有過類似的體驗,當 layout 變得復雜,后續的 UI 調試或者需求變更,都會變得很痛苦,你需要在 layout 文件內定位到合適的位置,然后調試或者修改。
當然,說到這里。你可能會說用 include 后者 merge標簽啊,當然可以,假設你使用了 include 標簽已經解決了 layout 文件過于復雜的問題,那我們接著討論業務邏輯代碼的問題。
氣喘吁吁的寫完了 layout,終于可以寫會業務代碼了,我們開心的切換文件到具體的 activity,準備進行具體的業務代碼開發,但面對這樣的長頁面,單單申明 View成員變量,就需要申明一大串,接著你要處理各中 View 的初始化以及更新,還可能要處理數據變化等等邏輯,詳情頁的邏輯會變得越來越復雜。對于這樣的詳情頁面,可以預見的是,代碼會超級多。
面對這樣的頁面,如果你是一個新人,后續需要你負責開發迭代,不得不說是一件很痛苦的事,自己也經歷過,當你為一個復雜頁面增加新功能,或者修改 bug,你往往先需要理解一下整個頁面邏輯,接著才可以修改。沒有人會喜歡閱讀動不動就兩三千行的 Activity 代碼的。
Activity 兩三千行??這一點也不夸張。
思考
到這里,面對這種稍微復雜的頁面開發,你已經發現用這種最原始的開發方式暴露出的問題了,代碼堆積問題,維護問題。現在不僅 layout 文件管理起來麻煩,更重要的是 Acticvity 里的代碼也變得難以維護。
一般的,我們遇到這種問題可能會持有兩種態度。一:既然別人能開發的出來,我就可以維護,就是稍微費勁點,多讀幾遍代碼,還是能看懂的,加班加點還是可以開發完的,只要完成,以后愛誰開發誰開發,我再也不碰了。典型的得過且過心態。另一種:
靈機一動
上 MVP,MVP 為解耦而生,是時候祭出 MVP 了。
嗯,現在的情形,使用 MVP 確實可以解決 Activity 臃腫的問題,使用 MVP 后可以把 DetailActivity 中的業務邏輯代碼都移到對應的 Presenter 中去,Activity 中剩下的只有 view 操作方法或者監聽方法。這樣 Activity 確實瘦了不少。但是這不是解決問題的根本,Layout 文件依舊很復雜,同時 Activity 中雖然把業務邏輯代碼成功遷移到了 Presenter 中,但是很多 view 的操作邏輯代碼還是在Activity。
那說了這么多,到底有什講么辦法可以解決上面提到的問題!
終極大招
模塊化 — 將一個大的復雜界面拆分為若干子界面模塊,這里需要通過一種恰當的代碼組織方式去幫助我們實現一個子界面模塊,這種所謂的恰當的模式就叫 ViewController ,通過 ViewController 我們可以把一個布局和業務邏輯封裝為一個模塊,Activity 只需要拿到這個模塊的實例,就可以操作這個模塊。
在 ViewController 的幫助下,我們面對這種復雜頁面,只要做好模塊劃分,那么每一個模塊對應一個 ViewController 實例,Activity 或 Fragment 只要持有他們的集合,就可以方便的操作控制他們。有木有很靈活,很輕量。
當你真的使用它之后,你會發現他帶來的便利其實不僅僅實現了模塊化。
特別感謝之前的 Leader 對 ViewController 這種思想給予最初的啟發和引導。
來自:http://gudong.name/2016/10/13/viewcontroller-foreword.html