我知道活动
被设计成表示我的应用程序的单个屏幕,而片段
被设计成可重用的UI布局,其中嵌入了逻辑。
直到不久前,我开发了一个应用程序,因为它说他们应该被开发。我创建了一个activity
来表示我的应用程序的屏幕,并使用了ViewPager
或Google Maps
的片段。我很少创建一个listfragment
或其他可以多次重用的UI。
最近,我偶然发现一个项目只包含两个activity
,一个是settingsactivity
,另一个是mainactivity
。MainActivity
的布局填充了许多隐藏的全屏UI片段,并且只显示了一个。在activity
逻辑中,在应用程序的不同屏幕之间有许多片段转换
。
我喜欢这种方法的地方在于,因为应用程序使用了ActionBar
,所以它保持原样,不会随着屏幕切换动画而移动,这是activity
切换所发生的情况。这给了一个更流畅的感觉,这些屏幕过渡。
所以我想我想问的是关于这个话题的你目前的开发方式,我知道乍一看这可能是一个基于观点的问题,但我把它看作是一个Android设计和架构的问题。。。不是一个真正基于观点的。
更新(01.05.2014):来自Square的Eric Burke的演讲(我不得不说这是一个很棒的演讲,为android开发者提供了很多有用的工具。我和Square没有任何关系)
http://www.infoq.com/presentations/android-design/
从我过去几个月的个人经验来看,我发现构造应用程序的最佳方法是创建一组片段来表示应用程序中的流,并在一个activity
中呈现所有这些片段。所以基本上,您的应用程序中的活动
的数量将与流的数量相同。这样,动作条在所有流的屏幕上都保持不变,但在改变流时会重新创建,这很有意义。正如Eric Burke所说的,也正如我逐渐意识到的那样,使用尽可能少的活动
的哲学并不适用于所有情况,因为这会在他称之为“上帝”的activity中造成混乱。
专家会告诉你:“当我看到UI时,我就知道是使用一个activity
还是使用一个片段
”。一开始,这是没有任何意义的,但随着时间的推移,您将能够判断是否需要fragment
。
我发现有一个很好的练习对我很有帮助。当我试图向我女儿解释一些事情的时候,我突然想到了这件事。
即,想象一个代表屏幕的框。你能在这个盒子里加载另一个屏幕吗?如果您使用一个新的框,您是否必须从第一个框复制多个项目?如果答案是肯定的,那么您应该使用fragments
,因为根activity
可以保存所有重复的元素以节省您创建它们的时间,并且您可以简单地替换框的部分。
但是不要忘记,你总是需要一个盒子容器(activity
),否则你的零件会被分散。一个里面有零件的盒子。
当心别误用这个盒子。Android UX专家建议(你可以在YouTube上找到他们),什么时候我们应该显式地加载另一个activity
,而不是使用片段
(就像我们处理具有类别的导航抽屉)。一旦您对片段
感到舒服,您就可以观看它们的所有视频。更重要的是,它们是强制性的材料。
您现在可以查看您的UI并确定您是否需要一个activity
或一个片段
吗?你有新的视角了吗?我想是你干的。
我的哲学是这样的:
只有在绝对绝对需要的情况下才创建一个activity。由于后台堆栈可用于提交一堆片段事务,我尝试在我的应用程序中创建尽可能少的活动。还有,在各个片段之间进行通信比在活动之间来回发送数据要容易得多。
activity的过渡很昂贵,对吧?至少我相信是这样的--因为旧的activity要被销毁/暂停/停止,推到堆栈上,然后要创建/启动/恢复新的activity。
这只是我的哲学自从碎片被引入。
好吧,根据Google的讲座(可能在这里,我不记得了),只要有可能,您就应该考虑使用片段,因为它使您的代码更容易维护和控制。
但是,我认为在某些情况下,它可能会变得太复杂,因为承载片段的activity需要在它们之间导航/通信。
我想你应该自己决定什么对你最好。通常,将activity转换成片段并不难,反之亦然。
我已经在这里写了一篇关于这个dillema的文章,如果你想进一步阅读的话。