介绍:
基本的“碎片教程”的格局基本是这样的:
- 在平板电脑上,有一个列表在左边,在右边的详细信息。
- 两者都是
Fragments
,并都驻留在同一个Activity
。 - 在手机上,有一个列表
Fragment
在一个Activity
。 - 推出新的
Activity
与细节Fragment
。
(例如Android 3.0的片段API通过戴安Hackborn和片段API指南 )
在这两个设备,功能是在Fragments
。 (简单)
在平板电脑 ,整个程序是1个Activity
,在手机上也有很多Activities
。
问题:
- 是否有一个原因到手机应用程序分割成许多
Activities
?
这种方法的一个问题 ,就是你在主平板复制了很多逻辑的 Activity
,并在不同的电话Activities
。
- 岂不是更容易保持在两种情况下,1个活性模式,采用的开关相同的逻辑
Fragments
和缩小(只是使用不同的布局)?
这样大部分逻辑驻留在Fragments
本身,并且仅存在单个Activity
-的代码重复以下。
还有我所了解的ActionBarSherlock
的是,它似乎工作最好的Fragments
,而不是Activities
(但我没有用它尚未工作)。
都是过于简单的教程,或者有我错过了什么在这种方法主要?
我们在办公室里成功尝试这两种方法 - 但我要开始一个更大的项目,并希望使事情容易让自己成为可能。
有些链接到相关的问题:
- 困境:当使用片段VS活动:
- 模式时使用活动转移VS动态片段
- Android的-我需要片段VS活动和观点的一些澄清
- 活动或片段的Android?
- 多个片段和活动的互动设计
- 那么,什么是片段在Android 3.0的确切的优势是什么?
更新
在问题开始赏金 - 仍然不服气,为什么我要重复在我的平板电脑活动,并在每部手机的活动我的应用程序逻辑。
还发现,通过在广场的家伙,这是很值得一读一篇有趣的文章:
我同意教程被大大简化。 他们只是引进Fragments
但建议我不要与模式一致。
我也同意,这不是重复在许多活动(请参阅您的应用程序的逻辑是一个好主意在维基百科上DRY原则 )。
我更喜欢在使用的模式ActionBarSherlock
片段演示应用程序( 在这里下载和这里的源代码 )。 在问题中提到的教程中最匹配的演示是一个称为“布局”中的应用; 或FragmentLayoutSupport
在源代码中。
在此演示,逻辑已经被移出的Activity
并进入Fragment
。 该TitlesFragment
实际上包含更改碎片的逻辑。 这样一来,每一项活动是非常简单的。 要复制很多非常简单的活动,其中没有逻辑的是活动里面,使得它非常简单。
通过将逻辑入片段,也没有必要写代码不止一次 ; 它是可用无论哪个活动的片段被放入。 这使得它比一个由基础教程提出了一个更强大的模式。
/**
* 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模式是您不含有大量的逻辑的平板活动结束了,这意味着你节省内存。 该教程模式会导致更复杂的应用有非常大的主要活动; 因为它需要处理所有的得到安置在任何时间碎片的逻辑。
总体而言,不认为它是被迫使用了许多活动。 把它看成是有机会到你的代码分割成许多碎片,并使用它们时节省内存。
我认为你是在正确的轨道上。 (是的,该教程是过度简化的)。
在平板电脑的布局,你可以使用进出片段单个活动和交换(在多个“窗格”)。 而在手机的布局,你可以使用一个新的活动,每一个片段。
像这样:
它可能看起来像很多额外的工作,但通过使用多个活动电话,您启用基本活动的生命周期和意图传递。 这也让框架来处理所有的动画和后栈。
为了帮助减少代码,你可以使用一个BaseActivity
和扩展。
因此,如果用户拥有平板电脑你会使用MyMultiPaneFragActivity
或类似的东西。 这种活性是负责从片段管理回调和路由意图到正确的片段(诸如搜索意图)
如果用户有一个手机,就可以使用普通的活动用很少的代码,并把它扩展MyBaseSingleFragActivity
或类似的东西。 这些活动可以很简单,5-10行代码(甚至更少)。
最棘手的部分是路由的意图和诸如此类的东西。 *(编辑:详见下文)。
我认为这是推荐的方式的原因是为了节省内存,并降低复杂性和耦合。 如果你换出片段,该FragmentManager
保持到碎片的回堆栈的参考。 它还简化了什么应该被“跑步”的用户。 这种设置还解耦从活动的生命周期在片段的观点和布局和逻辑。 这样的片段可以在单个活动存在,沿着另一片段(两窗格)中,或在三窗格活动等
*一个具有定期意图路由的好处是,你可以明确地从任何地方在后面堆栈推出的活动。 一个例子可能是在搜索结果的情况下。 (MySearchResults.class)。
有一个在这里阅读更多:
http://android-developers.blogspot.com/2011/09/preparing-for-handsets.html
这可能是多一点的前期工作,因为每个片段必须通过独立的活动很好地工作,但它通常不负有心人。 这意味着你可以使用定义不同的片段组合替代布局文件,保持片段代码模块化,简化了操作栏的管理,并让系统处理所有的回栈工作。
这里是雷托·梅尔的关于相同的答案,从拍摄这段视频的Udacity的Android基础课程 。
有许多原因你会破坏掉你的应用到不同的活动更好。
- 有一个单一的整体活动增加了代码的复杂性,使得它难以阅读,测试和维护。
- 使创建和管理意图过滤更难。
- 增加的紧密耦合独立的组件的风险。
- 使得它更可能带来安全风险,如果单一活动既包括可以安全地共享敏感信息和信息。
一个好的经验法则是每当环境的变化,以创建一个新的活动。 例如,显示不同种类的数据和在从观看到输入数据的切换。
这种方法的一个问题,就是你在主平板活动复制大量的逻辑,并在独立的电话活动。
在主从模式中,有两个活动。 一个示出了在较大的屏幕和在小屏幕上仅“主”片段两个片段。 其他显示在小屏幕上的“细节”片段。
您的详细逻辑应该在细节片段被捆绑起来。 因此,存在活动之间的相关细节逻辑没有代码重复-详细活动仅仅显示细节片段,也许在数据传递从Intent
额外。
还有我所了解的ActionBarSherlock的是,它似乎工作最好的片段,而不是活动(但我没有用它尚未工作)。
ActionBarSherlock没有更多的是与片段并不比本土行动起来吧,因为ActionBarSherlock是纯粹的原生操作栏的反向移植。
参照一号问题“是否有一个原因到手机应用程序分割成许多活动?” - 是的。 它简单归结为可用的空间,一台平板提供了更多的空间来发展,从而使开发人员将更多的在一个屏幕上。 Android的告诉我们, 活动可以提供一个屏幕 。 所以,你可以用1个大屏幕上的平板电脑做什么,是什么,可能需要在多个屏幕上散布在手机上,因为没有足够的空间,所有的片段。