我们正在编写一个包含4个标签的应用程序:地图,人物,地点,活动。应用程序中的人物,地点和事件在地图上显示为图标。默认情况下,“人物”,“位置”和“事件”选项卡均显示列表视图,自定义呈现,分别显示所有人物,地点和事件。
alt text http://web6.twitpic.com/img/37202700-f92052dc474b74e1760edda1c47f6940.4adcb134-scaled.png
现在,现在每个选项卡都有一个Intent设置为启动相应的活动。例如,有一个扩展MapActivity的MapTabActivity,一个显示人员的ShowPeopleListActivity,依此类推。
我看到一个lot of StackOverflow questions / answers说由于TabHost设置方式的各种限制,最好不要将活动用作标签的内容。例如,无法启动新活动并使其取代选项卡中的现有活动,而可以使用不同视图切换视图。
现在,我正处于十字路口。我们(无论好坏)花了相当多的时间来尝试让这个应用程序以其当前结构的方式工作,将活动作为选项卡的内容。当单击对应于Person,Place或Event的图标时,它会触发与该对象相对应的URI上的VIEW Intent;这是由一个活动拾取,然后显示该对象。相同的机制在Map和单个列表中都起作用。我们非常喜欢这为我们提供的松耦合;我们只是给人/地点/事件提供一个VIEW命令和URI,它会自动将我们带到正确的活动中。当然,启动的活动会覆盖标签视图而不是显示在其中,但我们愿意接受这一点。
这是一个问题:从Show活动中,我们希望能够回到地图,以该人,地点或事件为中心。我们可以启动一个新活动来再次显示地图,但现在我们将地图活动作为选项卡的内容,加上show活动,以及活动堆栈中的新地图活动;考虑到地图活动的资源密集程度,我猜这不是理想的方式。
我想我的问题是,是否有一个好的教程在某处显示如何使用TabHost执行复杂的任务?我见过HelloTabWidget;我正在寻找比这更复杂的东西。我担心如果我们切换到基于视图的做事方式,我们将不得不做大量的内务处理以拦截所有后台事件,尝试切换视图等等,以及以我们不想要的方式强烈耦合我们的程序。
对前进方向的任何建议都将非常感激。我们是Android的新手,所以我们试图遵循既定的最佳实践,但是当我们看到的几个例子对我们的用例过于简单时,很难。
答案 0 :(得分:8)
为您的标签设置一个活动和多个视图是一种很好的做法。但是,这确实意味着您必须小心处理选择的选项卡,每个选项卡视图的不同菜单和上下文菜单等。
我想我的问题是,有没有 好的教程在某处显示 究竟如何用a做复杂的任务 TabHost?我见过HelloTabWidget;我 寻找更多的东西 比这复杂。
我在我的博客上写了一个稍好的教程,演示了一个交互式ListView和MapView作为标签。这是链接:Android Tabs with interacting map and list views
基础是使布局类似于HelloTabWidget教程中的布局,使您的活动从MapActivity扩展,从XML中提取tabhost并确保在tabhost上调用setup()。之后,添加视图作为选项卡,选项卡侦听器等的内容是相同的。
以下是该课程的简要起点:
public class TabbedListMapActivity extends MapActivity {
private ListView listView;
private MapView mapView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tabHost = (TabHost) findViewById(android.R.id.tabhost);
// setup must be called if not a TabActivity
tabHost.setup();
// setup list view
listView = (ListView) findViewById(R.id.list);
// setup map view
mapView = (MapView) findViewById(R.id.mapview);
// add views to tab host
tabHost.addTab(tabHost.newTabSpec("List").setIndicator("List").setContent(new TabContentFactory() {
public View createTabContent(String arg0) {
return listView;
}
}));
tabHost.addTab(tabHost.newTabSpec("Map").setIndicator("Map").setContent(new TabContentFactory() {
public View createTabContent(String arg0) {
return mapView;
}
}));
}
...
答案 1 :(得分:7)
我看到很多StackOverflow 问题/答案说是由于 方式的各种限制 设置TabHost,最好不要使用 活动作为标签的内容。
作为反活动标签联盟(AATA)的自封任主席,这当然是我的立场。
当一个图标对应一个 点击了人物,地点或事件 触发URI上的VIEW Intent 对应于该对象;这是 然后被一个活动所吸引 显示对象。
请注意,这与将活动作为标签的内容无关。
我们可以发布一个新活动来展示 地图再次,但现在我们有地图 活动作为标签的内容, 加上节目活动,加上新的 活动堆栈中的地图活动; 鉴于资源如何密集地图 活动是,我猜这不是 理想的出行方式。
如果可能,我会避免它。
我担心如果我们切换到 基于观点的做事方式,我们会 必须做很多的家务管理 拦截所有后卫事件,试着去 切换视图等等 以及强烈耦合我们的计划 以某种我们不想要的方式。
这完全不符合您之前所写的内容。您的“后退事件”不会在使用“视图”作为选项卡的内容和使用“活动”作为选项卡的内容之间进行更改。此外,这与您描述的“松散耦合”模式没有任何关系 - 单击选项卡视图中列表中的图标与单击活动视图中列表中的图标没有什么不同。标签。
让您的Show活动告诉您的主要活动以显示特定位置,然后Show活动可以finish()
。在不在活动之间引入硬JVM耦合的情况下,最简单的方法是广播Intent
并在主活动中注册BroadcastReceiver
。收到此Intent
后,主要活动将更新地图并将其设置为当前选项卡。当然,如果主要活动使用“视图”作为其选项卡内容,则此方法更简单。
现在,如果您尝试对应用程序进行大修,那么在选项卡中导航不会启动另一个活动,而是将内容保存在自己的选项卡中......这是一个完整的“鱼的水壶”。
答案 2 :(得分:1)
例如,这是不可能的 发起一项新活动,并采取行动 现有活动的地方 在标签内,而有可能 用不同的方式切换视图 图。
我不认为这是不可能的。我试验了这个想法并写了一篇博客article来解释我的所作所为。我在文章末尾添加了一个示例代码项目,演示了我学到的一些有趣的事情。