Android 困境:何时使用片段与活动:
我知道Android 困境:何时使用片段与活动:,android,android-fragments,android-activity,architecture,Android,Android Fragments,Android Activity,Architecture,我知道活动被设计为表示我的应用程序的单个屏幕,而片段被设计为可重用的UI布局,其中嵌入了逻辑 直到不久前,我开发了一个应用程序,因为它说应该开发它们。 我创建了一个活动来表示我的应用程序的屏幕,并将片段用于ViewPager或googlemaps。我很少创建一个ListFragment或其他可以多次重用的UI 最近我偶然发现一个项目只包含两个活动,一个是设置活动,另一个是主活动。MainActivity的布局中填充了许多隐藏的全屏UI片段,只显示一个。在活动逻辑中,应用程序的不同屏幕之间有许多片
活动
被设计为表示我的应用程序的单个屏幕,而片段
被设计为可重用的UI布局,其中嵌入了逻辑
直到不久前,我开发了一个应用程序,因为它说应该开发它们。
我创建了一个活动
来表示我的应用程序的屏幕,并将片段用于ViewPager
或googlemaps
。我很少创建一个ListFragment
或其他可以多次重用的UI
最近我偶然发现一个项目只包含两个活动
,一个是设置活动
,另一个是主活动
。MainActivity
的布局中填充了许多隐藏的全屏UI片段,只显示一个。在活动
逻辑中,应用程序的不同屏幕之间有许多片段转换
我喜欢这种方法,因为应用程序使用了操作栏
,所以它保持不变,不会随着屏幕切换动画移动,这就是活动
切换所发生的情况。这给那些屏幕过渡带来了更流畅的感觉
所以我想我要问的是分享你目前关于这个主题的开发方式,我知道乍看起来可能是一个基于观点的问题,但我把它看作是一个Android设计和架构问题。。。这不是一个基于观点的观点
更新(2014年5月1日):以下是Eric Burke在Square上的演讲(我必须说这是一个很棒的演讲,为android开发者提供了很多有用的工具。我与Square没有任何关系)
根据我过去几个月的个人经验,我发现构建应用程序的最佳方法是创建一组片段,这些片段在应用程序中表示流,并在一个活动
中呈现所有这些片段。因此,基本上应用程序中的活动数与流数相同。
这样,操作栏在所有流的屏幕上保持不变,但在更改流时重新创建,这很有意义。正如埃里克·伯克(Eric Burke)所说,我也逐渐意识到,使用尽可能少的活动的理念并不适用于所有情况,因为这会在他所谓的“上帝”活动中造成混乱。好吧,根据谷歌的讲座(也许,我不记得了),在可能的情况下,您应该考虑使用片段,因为它使代码更易于维护和控制。
然而,我认为在某些情况下,它可能变得过于复杂,因为承载片段的活动需要在它们之间导航/通信
我认为你应该自己决定什么对你最好。通常,将活动转换为片段并不难,反之亦然
如果你想进一步阅读,我已经写了一篇关于这个难题的帖子。我的理念是:
仅当绝对需要时才创建活动。有了可用于提交大量片段事务的后台堆栈,我尝试在我的应用程序中创建尽可能少的活动。此外,不同片段之间的通信比在活动之间来回发送数据要容易得多
活动转换很昂贵,对吗?至少我相信是这样——因为旧活动必须被销毁/暂停/停止,推到堆栈上,然后新活动必须被创建/启动/恢复
自从引入片段以来,这就是我的哲学。专家会告诉你:“当我看到UI时,我会知道是使用活动
还是使用片段
”。一开始,这没有任何意义,但随着时间的推移,您将能够实际判断是否需要片段
我发现有一个很好的做法对我很有帮助。当我试图向女儿解释一些事情时,我突然想到了这一点
也就是说,想象一个代表屏幕的框。你能在这个盒子里再装一个屏幕吗?如果您使用一个新框,您是否需要从第一个框复制多个项目?如果答案是肯定的,那么您应该使用片段
,因为根活动
可以保存所有重复的元素以节省您创建它们的时间,并且您可以简单地替换方框的部分
但是别忘了你总是需要一个盒子容器(活动
),否则你的零件就会散开。一个盒子里面有零件
注意不要误用这个盒子。安卓用户体验专家建议(你可以在YouTube上找到他们)什么时候我们应该显式加载另一个活动
,而不是使用片段
(比如当我们处理有类别的导航抽屉时)。一旦您对片段感到满意,您就可以观看它们的所有视频。更重要的是,它们是强制性材料
您现在可以查看您的UI并确定是否需要活动
或片段
?你有新的观点吗?我想是的。不要忘记,活动是应用程序的块/组件,可以通过Intent共享和启动!因此,应用程序中的每个活动应该只解决一种任务。如果您的应用程序中只有一个任务,那么我认为您只需要一个活动和许多片段(如果需要)。当然,您可以在将来解决其他任务的活动中重用片段。这种方法将明确且合乎逻辑地分离任务。而且,您不需要为不同的片段集维护一个具有不同意图过滤器参数的活动。您可以在开发过程的设计阶段根据需求定义任务。还有更多的工作要做
if (id == R.id.forecast) {
ForecastFragment forecastFragment = new ForecastFragment();
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.main_content, forecastFragment);
ft.addToBackStack("backstack");
forecastFragment.setArguments(b);
ft.commit();
}