多少活动vs碎片?
介绍:
基本的“片段教程”模式如下所示:
Fragments
,都位于同一Activity
。 Activity
有一个列表Fragment
。 Fragment
启动新的Activity
。 (例如Dianne Hackborn提供的Android 3.0 Fragments API和Fragments API指南)
在这两个设备上,功能位于Fragments
。 (简单)
在平板电脑上 ,整个应用程序是1个Activity
,在手机上有很多Activities
。
问题:
Activities
? 这种方法存在的一个问题是,您在主要的平板电脑Activity
以及单独的电话Activities
复制了大量的逻辑。
Fragments
(仅使用不同的布局)? 通过这种方式,大部分逻辑都驻留在Fragments
本身中,并且只有一个Activity
- 减少重复代码。
另外我读到的有关ActionBarSherlock
是,它似乎最好与Fragments
而不是Activities
(但我还没有与它合作)。
这些教程是否过于简化了,还是我错过了这种方法的一些主要内容?
我们已经在办公室成功地尝试了两种方法 - 但我即将开始一个更大的项目,并希望尽可能让事情变得简单。
一些相关问题的链接:
更新
开始赏金问题 - 仍然不确信为什么我需要在平板电脑活动和每个手机活动中复制我的应用逻辑。
Square还发现了一篇有趣的文章,值得一读:
我同意这些教程非常简单。 他们只是介绍Fragments
但我不同意这种模式。
我也同意,在许多活动中复制应用程序的逻辑并不是一个好主意(请参阅维基百科上的DRY原则)。
我更喜欢ActionBarSherlock
Fragments Demo应用程序使用的模式(此处下载和源代码)。 与问题中提到的教程最接近的演示是应用程序中名为“布局”的演示; 或源代码中的FragmentLayoutSupport
。
在这个演示中,逻辑已经被移出Activity
并进入Fragment
。 TitlesFragment
实际上包含了改变Fragments的逻辑。 这样,每个活动都非常简单。 要复制许多非常简单的活动,其中没有任何逻辑在活动内部,这使得它非常简单。
通过将逻辑放入碎片中, 不需要多次编写代码 ; 无论将碎片放入哪个活动都可用。 这使得它比基本教程中提出的模式更强大。
/**
* Helper function to show the details of a selected item, either by
* displaying a fragment in-place in the current UI, or starting a
* whole new activity in which it is displayed.
*/
void showDetails(int index)
{
mCurCheckPosition = index;
if (mDualPane)
{
// We can display everything in-place with fragments, so update
// the list to highlight the selected item and show the data.
getListView().setItemChecked(index, true);
// Check what fragment is currently shown, replace if needed.
DetailsFragment details = (DetailsFragment) getFragmentManager()
.findFragmentById(R.id.details);
if (details == null || details.getShownIndex() != index)
{
// Make new fragment to show this selection.
details = DetailsFragment.newInstance(index);
// Execute a transaction, replacing any existing fragment
// with this one inside the frame.
FragmentTransaction ft = getFragmentManager()
.beginTransaction();
ft.replace(R.id.details, details);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();
}
}
else
{
// Otherwise we need to launch a new activity to display
// the dialog fragment with selected text.
Intent intent = new Intent();
intent.setClass(getActivity(), DetailsActivity.class);
intent.putExtra("index", index);
startActivity(intent);
}
}
ABS模式的另一个优点是,您最终不会得到包含大量逻辑的平板电脑活动,这意味着您可以节省内存。 教程模式可以导致更复杂的应用程序中的一个非常大的主要活动; 因为它需要随时处理所有放置在其中的碎片的逻辑。
总的来说,不要以为它被迫使用许多活动。 认为它有机会将你的代码分成许多片段,并在使用它们时节省内存。
我认为你在正确的轨道上。 (是的,教程过于简化)。
在平板电脑布局中,您可以使用单个Activity和换入和换出碎片(在多个“窗格”中)。 在电话布局中,您可以为每个片段使用新的活动。
像这样:
它可能看起来像很多额外的工作,但通过使用多个手机活动,您可以启用基本的活动生命周期和意图传递。 这也允许框架处理所有的动画和后备栈。
为了帮助减少代码,您可以使用BaseActivity
并进行扩展。
所以如果用户有平板电脑,你可以使用MyMultiPaneFragActivity
或类似的东西。 此活动负责管理从片段和路由意图到正确片段的回调(例如搜索意图)
如果用户有电话,则可以使用少量代码的常规活动,并让它扩展MyBaseSingleFragActivity
或类似的东西。 这些活动可能非常简单,5-10行代码(甚至更少)。
棘手的部分是路由意图和whatnot。 *(编辑:见下面更多)。
我认为这是推荐方式的原因是为了节省内存并降低复杂性和耦合性。 如果您正在交换碎片,则FragmentManager
维护对该FragmentManager
的引用。 它还简化了用户应该“跑步”的内容。 这种设置还可以将活动生命周期中的片段中的视图,布局和逻辑分离。 这样,片段可以存在于单个活动中,与另一个片段(双窗格)或三窗格活动等一起存在。
*定期进行意向路由的好处之一是您可以从后端堆栈中的任何位置显式启动一个活动。 搜索结果就是一个例子。 (MySearchResults.class)。
请阅读更多信息:
http://android-developers.blogspot.com/2011/09/preparing-for-handsets.html
这可能需要多一点前期工作,因为每个片段都必须在单独的活动中运行良好,但通常情况下会有好处。 这意味着您可以使用替代布局文件来定义不同的片段组合,保持片段代码模块化,简化操作栏管理,并让系统处理所有后退堆栈工作。
从Udacity的Android Fundamentals课程视频中可以看到Reto Meier的回答。
有很多原因可以让您将应用分成不同的活动。
一个好的经验法则是在上下文发生变化时创建一个新的活动。 例如,显示不同类型的数据并从查看切换到输入数据。
链接地址: http://www.djcxy.com/p/23147.html上一篇: How many Activities vs Fragments?
下一篇: How to determine when Fragment becomes visible in ViewPager