gpt4 book ai didi

java - fragment 设计 : Adapting to multiple screen layouts by showing/hiding fragments within a single Activity?

转载 作者:IT老高 更新时间:2023-10-28 20:48:32 25 4
gpt4 key购买 nike

我正在尝试了解如何使用 Fragments 创建能够很好地适应多种屏幕和布局的应用程序。我研究了几个例子:

  1. Fragments Android 开发者指南中的文档。
  2. Google IO app
  3. 来自 ActionBar Sherlock 的 fragment 样本.

所有这些都提倡多Activity方法:

  • 在大屏幕上,显示单个 Activity 和多个 Fragments
  • 在较小的屏幕上,将 Fragment 拆分为多个 Activity

我想到了另一种方法 - 单个 Activity 一个:

  • 拥有一个包含所有 FragmentActivity
  • 根据屏幕大小和方向,显示/隐藏适当的 Fragment(s)(使用 FragmentTransaction.show()/FragmentTransaction.hide() )。

使用 Android 开发者指南使用的相同“新闻文章列表/文章内容”示例进行说明:

  • News Activity 同时包含 ArticleListFragmentArticleReaderFragment
  • 在选项卡上,始终显示两个 fragment 。
  • 在手机上,ArticleReaderFragment 最初是隐藏的。当从列表中选择一篇文章时,ArticleListFragment 被隐藏,ArticleReaderFragment 被显示。

有人用过类似的方法吗?这种方法可能有任何实际的缺点吗?与多 Activity 方式相比,它看起来更好/更差吗?例如, fragment 不能在 XML 中显示/隐藏 - 为此必须使用 FragmentTransaction


编辑 1:假设场景的描述

想象一个应用程序可以在屏幕上一次显示多达三个“ Pane ”。此外,这些是需要考虑的因素:

  • 手机一次只能显示一个 Pane (无论纵向/横向)
  • 7 英寸平板电脑可以显示 2 个 Pane ,纵向拆分为纵向,横向拆分为横向。
  • 10 英寸以上的平板电脑可以显示 2 个 Pane ,纵向拆分; 3 个 Pane 横向水平拆分。

为简单起见,让我们不要讨论电视屏幕。

现在,将其转化为设计:

  • 我们有三个 fragment :Frag1、Frag2 和 Frag3。
  • 在最简单的情况下,所有三个 fragment 都在一个 Activity 中(我们称之为 ActivityA)。这是 10 英寸横向外壳。
  • 另一种“简单”的情况是每个 Fragment 都在自己的 Activity 中 - ActivityA 包含 Frag1; ActivityB 包含 Frag2,ActivityC 包含 Frag3。

到目前为止,我们还没有考虑任何与 Android 开发人员指南中介绍的新闻阅读器示例有显着差异的内容。唯一的主要区别是有 三个 fragment 而不是两个。

现在,7 英寸标签的情况下只能容纳 2 个 fragment 。这将如何工作?请注意,这里有两种可能的组合:

  1. Frag1 和 Frag2 正在显示中。
  2. Frag2 和 Frag3 正在显示中。

我只是无法理解这一点。我是否在 ActivityA 中完成所有这些操作?我只是创建一个全新的 ActivityD 吗?我需要创建多少个布局(我数了大约 8 个)?是不是排列太多了?

我确实意识到我上面提出的单一 Activity 方法也可能不适合这种情况 - 因为显示/隐藏 fragment 本身并不简单。

关于如何在不被布局和组合淹没的情况下处理这个问题有什么建议吗?

最佳答案

This @Taylor Clark 的回答非常有用。但是,这并不是我在原始问题中提出的使用单一 Activity 方法的实际经验分享。我着手修改 Android 开发人员指南中的 News Reader 示例以使用单 Activity 方法,并提出了一个可行的解决方案。

还有待观察的是,在哪些用例中这种方法比多 Activity 方法更可取(或者是否有任何此类情况)。此外,我还没有详细了解我的问题的编辑 1 中描述的 3 Pane 方案。

我希望尽快发布我的整个项目,但这里是我如何进行的快速概述:

  • 单个Activity:NewsActivity
  • 两个 fragment :TitlesListFragmentDetailsFragment
  • 这两个 fragment 始终存在于 NewsActivity 中。根据当前的双 Pane ,我显示/隐藏适当的 fragment 。

我遇到的一些问题:

是否将布局指定为双 Pane :

在原始新闻阅读器示例中,双 Pane 布局有一个 FrameLayout 用于保存新闻详细信息。我们通过测试这个 Frame Layout 的存在来判断我们当前是否处于双 Pane 布局中。

但是,在我的解决方案中,两个 fragment 始终存在于所有布局中。我通过在我想要成为双 Pane 的布局中包含一个 ID 为 dualPaneandroid:visibility="gone"View 来解决这个问题并在单 Pane 布局中省略此 View 。然后,这是一个问题

mDualPane = findViewById(R.id.dualPane)!=null;

编辑:

有比使用虚拟 View 更好的方法来指定双 Pane 。我更喜欢创建一个 boolean 资源。例如,我有一个 config.xml 如下:

<resources>
<bool name="dual_pane">false</bool>
</resources>

然后,我可以将其他 config.xml 文件放在 values-xlarge-landvalues-portvalues 等文件夹中-sw600dp 等并根据需要将 boolean 值调整为 truefalse

那么,在代码中就是getResources().getBoolean(R.bool.dual_pane);

关闭详细信息 fragment

这是区分 Activity 关闭和 Fragment 关闭的问题。最后,我不得不重写 onBackPressed() 如下:

  • 在双 Pane 模式下,只需调用 super.onBackPressed();
  • 在单 Pane 模式下,如果我们在TitlesListFragment,调用super.onBackPressed();
  • 在单 Pane 模式下,如果我们在DetailsFragment中,则将其视为关闭 fragment 。这意味着隐藏它并显示 TitlesListFragment

这并不理想,但这是我能想到的最好的。

编辑:

根据@SherifelKhatib 在评论中的建议,有一种更简洁的方式来处理后退按钮按下:只需将显示/隐藏细节 fragment 的事务添加到 fragment 后台堆栈。这样,当您按下后退按钮时, fragment 事务就会被反转。如果您希望在其他按钮单击时这样做,也可以手动弹出 backstack。

关于java - fragment 设计 : Adapting to multiple screen layouts by showing/hiding fragments within a single Activity?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10051962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com