繁体   English   中英

Android - 标签,MapView,标签内的活动

[英]Android - Tabs, MapView, activities within tabs

我们正在编写一个包含4个标签的应用程序:地图,人物,地点,活动。 应用程序中的人物,地点和事件在地图上显示为图标。 默认情况下,“人物”,“位置”和“事件”选项卡均显示列表视图,自定义呈现,分别显示所有人物,地点和事件。

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

现在,现在每个选项卡都有一个Intent设置为启动相应的活动。 例如,有一个扩展MapActivity的MapTabActivity,一个显示人员的ShowPeopleListActivity,依此类推。

我看到了很多 StackOverflow的 问题 /回答说,由于路上的各种限制的TabHost是设置,最好不要使用活动选项卡的内容。 例如,无法启动新活动并使其取代选项卡中的现有活动,而可以使用不同视图切换视图。

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

这是一个问题:从Show活动中,我们希望能够回到地图,以该人,地点或事件为中心。 我们可以启动一个新活动来再次显示地图,但现在我们将地图活动作为选项卡的内容,加上show活动,以及活动堆栈中的新地图活动; 鉴于地图活动的资源密集程度,我猜这不是理想的方式。

我想我的问题是,是否有一个好的教程在某处显示如何使用TabHost执行复杂的任务? 我见过HelloTabWidget ; 我正在寻找比这更复杂的东西。 我担心如果我们切换到基于视图的做事方式,我们将不得不做大量的内务处理以拦截所有后台事件,尝试切换视图等等,以及以我们不想要的方式强烈耦合我们的程序。

对前进方向的任何建议都将非常感激。 我们是Android的新手,所以我们试图遵循既定的最佳实践,但是当我们看到的几个例子对我们的用例过于简单时,这很困难。

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

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

当单击对应于Person,Place或Event的图标时,它会触发与该对象相对应的URI上的VIEW Intent; 这是由一个活动拾取,然后显示该对象。

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

我们可以启动一个新活动来再次显示地图,但现在我们将地图活动作为选项卡的内容,加上show活动,以及活动堆栈中的新地图活动; 鉴于地图活动的资源密集程度,我猜这不是理想的方式。

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

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

这完全不符合您之前所写的内容。 您的“后退事件”不会在使用“视图”作为选项卡的内容和使用“活动”作为选项卡的内容之间进行更改。 此外,这与您描述的“松散耦合”模式没有任何关系 - 单击选项卡视图中列表中的图标与单击活动视图中列表中的图标没有什么不同。一个标签。

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

现在,如果您尝试对应用程序进行大修,那么在选项卡中导航不会启动另一个活动,而是将内容保存在自己的选项卡中...这是一个完整的“鱼的水壶”。

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

我想我的问题是,是否有一个好的教程在某处显示如何使用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;
        }
    }));
}

...

例如,无法启动新活动并使其取代选项卡中的现有活动,而可以使用不同视图切换视图。

我不认为这是不可能的。 我试验了这个想法并撰写了一篇博客文章,解释了我的所作所为。 我在文章末尾添加了一个示例代码项目,演示了我学到的一些有趣的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM