Android浮动视图跨越活动

6

需求

我的应用程序有2个活动,称为A和B,具有导航,例如A->BB->A(在返回时)。我的要求是:

  • 我希望一个视图/布局浮动在屏幕上,无论当前可见的是哪个活动。我在应用程序启动时(在activity A的onCreate中)填充此视图,它在从A->B的过渡期间以及B处于屏幕上时保持静态。
  • 因此,自然而然地,这个视图只应该被填充一次(当应用程序启动时,在A的onCreate中)。

我发现的

我进行了一些搜索,并从中找到了两种在Android中重用布局的方法:

  • 使用 <include>

    它似乎只是一个工具,用于编写常用UI元素的XML代码。每次在父布局中使用它时,都会填充它。

  • 使用 ViewStub

    我研究了如何使用ViewStub,它似乎也是在许多布局中重用代码段的一种方法。除非在运行时使它们可见,否则每次在布局中使用它时都需要填充它。

我的另一个要求提示

对于熟悉iPhone开发的人,您可以将视图添加到UIWindow中,无论当前活动的是哪个UIViewController,它都会保留在那里。我希望在我的应用程序中实现完全相同的行为。

我的原始设置

我针对Android 2.1及以上版本进行了定位。从API级别11(Android 3.0)及以上版本开始提供Fragment。一种选择是使用Android兼容性库,该库使旧版本中的Fragment可用。我目前正在研究这个问题。但我也想知道是否有其他方法可满足我的要求,而不是更改整个项目并使用片段。

我的应用程序中有大约30个活动,我希望此布局浮动在所有活动上方。我只是创建了一个包含2个活动的测试用例,以使问题简单易懂。


Activity AActivity B有什么不同之处?为什么不只使用一个带有固定ViewActivity,并调整其他所有内容呢? - Squonk
好的,我知道你在问什么。事实上,我有大约30个活动,几乎不可能在单个活动中处理每个页面。为了提出问题,我编写了一个只有2个活动的测试用例。抱歉,我会编辑问题以澄清这一点。 - Krishnabhadra
1个回答

2

解决方案1:FrameLayout

我认为你想要使用的是FrameLayout。FrameLayout被设计用于在屏幕上阻挡出一个区域以显示单个项。子视图按堆栈顺序绘制,最近添加的子视图位于顶部。

http://developer.android.com/reference/android/widget/FrameLayout.html

然后在这里阅读有关回退栈的信息,你可以在你的活动中使用它来在活动之间来回切换:

http://developer.android.com/guide/topics/fundamentals/tasks-and-back-stack.html

解决方案2:片段事务

不要编写两个单独的活动,而是编写一个带有两个片段的单个活动。以下是来自片段文档的摘录:

"片段必须始终嵌入到活动中,片段的生命周期直接受到主机活动的生命周期的影响。例如,当活动暂停时,其中的所有片段也会暂停,当活动被销毁时,其中的所有片段也会被销毁。但是,在活动运行时(处于恢复的生命周期状态),你可以独立地操作每个片段,例如添加或删除它们。当你执行这样的片段事务时,你还可以将其添加到由活动管理的后退栈中——活动中的每个后退栈条目都是发生的片段事务的记录。后退栈允许用户通过按返回按钮来撤消片段事务(向后导航)。”


关于您的解决方案2,我无法使用片段,因为片段需要API Level 11(Android 3.0),而我正在针对API Level 7(Android 2.1)及以上版本进行开发。我在问题中已经说明了这一点。 - Krishnabhadra
关于解决方案1,我不确定我理解了。我应该在哪个活动中添加这个FrameLayout?另请参见我的问题编辑(位于我的原始设置下)。 - Krishnabhadra
1
您可以通过包含兼容性库(http://developer.android.com/sdk/compatibility-library.html)来使用Android 1.6 中的片段。 - Adinia
1
你可以使用兼容性库在Android 2.1中使用Fragment(我一直都在使用,效果非常好):http://android-developers.blogspot.com/2011/03/fragments-for-all.html - Jonathan Schneider
谢谢,让我看一下。仍然很遗憾在Android中没有像UIWindow那样的设置。 - Krishnabhadra
@jkschneider 我编辑了我的问题,删除了关于在Android 2.1中使用Fragment的误导性错误。你的关注是有帮助的。 - Krishnabhadra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接