android - toolbar返回按钮大小 - toolbar隐藏title




困境:何时使用碎片与活动: (10)

fragment重叠活动的一大优势是,用于片段的代码可用于不同的活动,因此它在应用程序开发中提供了代码的可重用性

我知道Activities被设计成代表我的应用程序的单个屏幕,而Fragments被设计成可重用的UI布局,其中嵌入了逻辑。

直到不久之前,我开发了一个应用程序,因为它表示应该开发它们。 我创建了一个Activity来表示我的应用程序的屏幕,并使用Fragments作为ViewPagerGoogle Maps 。 我很少创建可重复使用多次的ListFragment或其他UI。

最近我偶然发现了一个只包含2个Activities的项目,其中一个是SettingsActivity ,另一个是MainActivityMainActivity的布局填充了许多隐藏的全屏UI片段,只显示一个。 在Acitivty逻辑中,应用程序的不同屏幕之间有许多FragmentTransitions

我喜欢这种方法是因为应用程序使用了一个ActionBar ,它保持不动,不会随着屏幕切换动画而移动,这是Activity切换时发生的情况。 这给了这些屏幕转换更流畅的感觉。

所以我想我要问的是分享你关于这个话题的当前发展方式,我知道它可能看起来像一个基于意见的问题,但我把它看作是一个Android设计和体系结构问题......并不是真的意见为主。

UPDATE(01.05.2014):SquareEric Burke演讲之后(我不得不说这是一个很棒的演示文稿,其中有很多针对android开发者的有用工具,而且我与Square没有任何关系)

http://www.infoq.com/presentations/Android-Design/

根据我过去几个月的个人经验,我发现构建应用程序的最佳方式是创建代表应用程序中流的片段组,并将所有这些片段呈现在一个Activity 。 所以基本上,您的应用程序中的Activities数量与流量数量相同。 这样,操作栏在所有流程的屏幕上保持完好无损,但正在通过改变流程来重新创建,这很有意义。 正如埃里克伯克所说的那样,我也逐渐意识到,尽可能少使用Activities的理念不适用于所有情况,因为它在他所谓的“上帝”活动中造成混乱。


不要忘记,一个活动是应用程序的块/组件,可以通过Intent共享和启动! 因此,应用程序中的每个活动只能解决一种任务。 如果你的应用程序只有一个任务,那么我认为你只需要一个活动和许多片段。 当然,您可以在将来的活动中重复使用片段来解决其他任务。 这种做法将明确和合理地分离任务。 而且您不需要针对不同的片段组维护一个具有不同意图过滤器参数的活动。 您可以根据需求在开发过程的设计阶段定义任务。


为什么我喜欢所有情况下的活动片段?

  • 活动很昂贵。 在片段中,视图和属性状态是分开的 - 每当片段在backstack ,其视图将被销毁。 所以你可以堆叠比活动更多的碎片。

  • Backstack操纵。 使用FragmentManager ,很容易清除所有碎片,插入多于碎片等。 但对于活动来说,操纵这些东西将是一场噩梦。

  • 一个可预测的生命周期 。 只要主机活动未被回收。 堆叠中的碎片将不会被回收。 所以可以使用FragmentManager::getFragments()来查找特定的片段(不鼓励)。


事情我做了:尽可能少使用片段。 不幸的是,几乎可以这样做。 所以,我最终得到了很多碎片和一些活动。 我已经意识到一些缺点:

  • ActionBar &Menu:当2个片段有不同的标题,菜单,那个
    将很难处理。 例如:添加新片段时,您可以更改操作栏标题,但是当从backstack弹出时,无法恢复旧标题。 你可能需要在这个案例的每个片段中都有一个工具栏,但是让我相信,这会花费你更多的时间。
  • 当我们需要startForResult ,活动有但是片段没有。
  • 默认情况下不要有过渡动画

我的解决方案是使用一个活动来包装一个片段。 所以我们有单独的操作栏,菜单, startActivityForResult ,动画...


在我看来,它并不真正相关。 要考虑的关键因素是

  1. 你多久会重用部分UI(例如菜单),
  2. 这款应用还适用于平板电脑吗?

片段的主要用途是构建多面板活动,这使其适用于平板电脑/手机响应应用程序。


我使用Fragments改善用户体验。 例如,如果您有一个按钮,并且您希望在单击它时运行一个web服务,那么我会将一个片段附加到父活动。

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();
}

这样用户就不必在另一个活动中移动。

其次,我更喜欢片段,因为您可以在旋转过程中轻松处理它们。


我认为使用片段比使用活动更好,但使用frament管理后退堆栈按钮很困难


每个应用程序使用一个活动为fragment使用fragment提供基础,与activites片段相比,片段是activites片段可重用片段更适合支持手机和平板电脑的应用程序


那么,根据谷歌的讲座(也许here ,我不记得),你应该考虑在可能的时候使用Fragments,因为它使你的代码更易于维护和控制。

不过,我认为在某些情况下,它可能会变得太复杂,因为承载片段的活动需要在它们之间导航/通信。

我想你应该自己决定什么对你最好。 将活动转换为片段通常并不难,反之亦然。

如果你想进一步阅读,我已经在here创建了关于这个dillema的帖子。


除了你意识到的还有更多,你必须记住,发起的活动不会隐含地破坏调用活动。 当然,你可以设置它,让你的用户点击一个按钮进入一个页面,你启动该页面的活动并销毁当前页面。 这会导致很多开销。 我能给你的最好的指导是:

**只有在主要活动和同一时间打开主要活动(想到多个窗口)时才开始新的活动。

一个很好的例子是什么时候开展多项活动是有道理的。 主要活动提供了一个文件浏览器。 打开文件时,会启动一个新的活动来查看该文件。 您可以按最近的应用程序按钮,这将允许您返回浏览器而不关闭打开的文档,然后甚至可以打开与第一个文档并行的另一个文档。





architecture