Android:使用ActivityGroup嵌入活动

15
我正在设计一个应用程序的概念和界面阶段,但遇到了一点问题。本质上,我想找一种方法将一个活动嵌入到另一个类似于TabHost/TabActivity的UI中。屏幕顶部会有一个窗口,其中包含另一个活动,并且在窗口下方有独立于上面活动的按钮和控件,应该始终可见。用户可以在窗口中从一个活动导航到另一个活动,而不会对下面的控件造成任何影响。
在研究这个问题时,我发现了ActivityGroup,看起来很有用,但如何实现呢?有没有人有ActivityGroup的经验或其他想法?
1个回答

20

是的,您需要实现一个ActivityGroup作为其他活动的容器。当用户单击按钮之一时,您会获取对LocalActivityManager的引用,并使用它来启动并嵌入内部活动。像这样:

LocalActivityManager mgr = getLocalActivityManager();

Intent i = new Intent(this, SomeActivity.class);

Window w = mgr.startActivity("unique_per_activity_string", i);
View wd = w != null ? w.getDecorView() : null;

if(wd != null) {
    mSomeContainer.addView(wd);
}
注意,使用此方法可能相当复杂,因为除非焦点恰到好处,否则按下硬件按钮(例如菜单按钮)将只会在ActivityGroup上触发事件,而不是内部Activity。您必须找到一种方法,在将其添加到容器视图后,将焦点放在内部活动上,此时事件将在内部活动中发生并传播到容器活动。
我已经做过这个,并且它有效。它只是比我认为应该的要复杂一些。
无论如何,我通过查看TabHost代码获得了大部分信息,可以在这里找到:这里

哦,太好了,我正在寻找TabHost源代码。这看起来不错,但对我来说都很新。能否解释一下您在代码示例中正在做什么? - mtmurdock
1
startActivity 部分只是在不在屏幕上显示的情况下启动 Activity。然后,您可以获取包含所有内容的 View,并将其添加到 ActivityGroup 内部的 View 中。LocalActivityManager 会为您管理所有内容,例如在按下主页按钮时向您的内部 Activity 发送 onPause 和 onResume。 - synic
还有一件事:这个“window”对象是什么,它是如何实现的?我能否在布局中放置一个<window>标签,然后在代码中进行分配?附言:谢谢,你太棒了。 - mtmurdock
搞定了。你的帮助非常大。谢谢! - mtmurdock

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