Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 困境:何时使用片段与活动:_Android_Android Fragments_Android Activity_Architecture - Fatal编程技术网

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 BurkeSquare上的演讲(我必须说这是一个很棒的演讲,为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();
}