Android 复杂界面开发实践之 ViewController : 前言

本人博客地址http://gudong.name

本文博客地址:http://gudong.name/2016/10/13/viewcontroller-foreword.html

首先说明的是 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 只要持有他们的集合,就可以方便的操作控制他们。有木有很灵活,很轻量。

当你真的使用它之后,你会发现他带来的便利其实不仅仅实现了模块化。

具体关于 ViewController 的介绍 请看下一篇 Android 复杂界面开发实践之 ViewController : 介绍

特别感谢之前的 Leader 对 ViewController 这种思想给予最初的启发和引导。

关于开源

目前代码已开源,项目地址

 

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,398评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 推荐编辑器 Chrome最佳插件 - 马克飞象 跨平台软件,印象笔记爱好者肯定需要 - Haroopad/Subl...
    xzonepiece阅读 13,265评论 12 37
  • 周日,儿子早中晚三门课外班,学校作业还没做完,今天又要比较晚睡觉。真心不想这样。感赏儿子的坚持,他心里也想更好。 ...
    玲03阅读 166评论 0 0
  • 那天在一家饭店阴差阳错般点了一份羊杂汤。一入口是寡淡。却不小心勾起了一些回忆里的味道。在兰州时吃羊杂汤的次数确是不...
    聊减肥话瘦身阅读 518评论 0 0