11

我们正在编写一个有 4 个选项卡的应用程序:地图、人物、地点、事件。应用程序中的人物、地点和事件在地图上显示为图标。默认情况下,人物、地点和事件选项卡每个都显示一个列表视图,自定义呈现,分别显示所有人物、地点和事件。

替代文字 http://web6.twitpic.com/img/37202700-f92052dc474b74e1760edda1c47f6940.4adcb134-scaled.png

现在,现在每个选项卡都有一个 Intent 集作为其内容,以启动相应的活动。例如,有一个扩展 MapActivity 的 MapTabActivity,一个显示人员的 ShowPeopleListActivity,等等。

我看到很多 StackOverflow问题/答案说由于 TabHost 设置方式的各种限制,最好不要将活动用作选项卡的内容 例如,不可能启动一个新活动并让它取代选项卡中的现有活动,但可以用不同的视图切换视图。

现在,我正处于十字路口。我们(无论好坏)投入了相当多的时间,试图让这个应用程序以它当前的结构方式工作,将活动作为选项卡的内容。当点击对应于人物、地点或事件的图标时,它会在对应于该对象的 URI 上触发 VIEW Intent;这是由一个 Activity 拾取的,然后显示该对象。同样的机制在 Map 和单个列表中都起作用。我们真的很喜欢这为我们提供的松散耦合;我们只需给出一个 VIEW 命令和人/地点/事件的 URI,它就会自动将我们带到正确的活动。诚然,启动的活动掩盖了选项卡视图,而不是出现在其中,但我们愿意接受这一点。

但这里有一个问题:从 Show 活动中,我们希望能够返回以该人、地点或事件为中心的地图。我们可以再次启动一个新的activity来展示地图,但是现在我们有了map activity作为tab的内容,加上show activity,再加上activity stack中的新map activity;考虑到地图活动的资源密集程度,我猜这不是理想的方式。

我想我的问题是,是否有一个很好的教程可以准确地展示如何使用 TabHost 完成复杂的任务?我见过HelloTabWidget;我正在寻找比这更复杂的东西。我担心如果我们切换到基于视图的做事方式,我们将不得不做很多内务来拦截所有的后台事件,尝试切换视图等,等等,以及以我们不想要的方式强耦合我们的程序。

任何关于前进道路的建议将不胜感激。我们是 Android 新手,因此我们正在尝试遵循已建立的最佳实践,但是当我们看到的少数示例对于我们的用例而言过于简单时,这会很困难。

4

3 回答 3

8

我看到很多 StackOverflow 问题/答案说,由于 TabHost 设置方式的各种限制,最好不要将活动用作选项卡的内容。

作为反活动标签联盟 (AATA) 自封的主席,这当然是我的立场。

当点击对应于人物、地点或事件的图标时,它会在对应于该对象的 URI 上触发 VIEW Intent;这是由一个 Activity 拾取的,然后显示该对象。

请注意,这与将活动作为选项卡的内容无关。

我们可以再次启动一个新的activity来展示地图,但是现在我们有了map activity作为tab的内容,加上show activity,再加上activity stack中的新map activity;考虑到地图活动的资源密集程度,我猜这不是理想的方式。

如果可能的话,我会避免它。

我担心如果我们切换到基于视图的做事方式,我们将不得不做很多内务来拦截所有的后台事件,尝试切换视图等,等等,以及以我们不想要的方式强耦合我们的程序。

这与你之前写的完全不同。您的“返回事件”不会在使用视图作为选项卡的内容和使用活动作为选项卡的内容之间改变一丁点。此外,这与您描述的“松散耦合”模式无关 - 单击选项卡中视图中列表中的图标与单击活动中视图中列表中的图标没有什么不同一个标签。

只需让您的 Show 活动告诉您的主要活动以显示特定位置,然后 Show 活动即可finish()。在不在活动之间引入硬 JVM 耦合的情况下,最简单的方法是在主活动中广播Intent并注册 a BroadcastReceiver。收到此Intent消息后,主要活动将更新地图并将其设置为当前选项卡。当然,如果您的主要活动使用视图作为其选项卡内容,则此方法更简单。

现在,如果您尝试彻底检查您的应用程序,以便在选项卡中导航不会启动另一个活动,而是将内容保留在其自己的选项卡中......那就是一个完整的“鱼缸”。

于 2009-10-19T19:04:15.520 回答
8

为您的选项卡设置一个活动和多个视图是一种很好的做法。但是,这确实意味着您必须小心处理选择了哪个选项卡、每个选项卡视图的不同菜单和上下文菜单等。

我想我的问题是,是否有一个很好的教程可以准确地展示如何使用 TabHost 完成复杂的任务?我见过 HelloTabWidget;我正在寻找比这更复杂的东西。

我在我的博客上写了一个稍微好一点的教程,演示了交互的 ListView 和 MapView 作为选项卡。这是链接:具有交互地图和列表视图的 Android 选项卡

基础是有一个类似于 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;
        }
    }));
}

...

于 2010-09-12T17:37:43.717 回答
1

例如,不可能启动一个新活动并让它取代选项卡中的现有活动,但可以用不同的视图切换视图。

我不认为这是不可能的。我尝试了这个想法并写了一篇博客文章来解释我做了什么。我在文章末尾包含了一个示例代码项目,它展示了我学到的一些有趣的东西。

于 2010-11-11T19:15:44.527 回答