Android – 选项卡,地图视图,标签内的活动

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

替代文字http://sofzh.miximages.com/java/twitter.com

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

我看到很多 StackOverflow的 问题 /答案,说由于TabHost设置方式的各种限制,最好不要使用活动作为标签的内容。 例如,不可能启动一个新的活动,并且在一个标签中取代现有的活动,而用不同的视图切换一个视图是可能的。

现在,我正处在一个十字路口。 我们已经(无论好坏)投入相当多的时间试图让这个应用程序以当前结构化的方式工作,并以Activities作为标签的内容。 当点击一个与Person,Place或Event对应的图标时,它会在对应于该对象的URI上触发一个VIEW Intent; 这是由一个活动,然后显示对象拾起。 Map和单个列表中都有相同的机制。 我们真的很喜欢这给我们提供的松散耦合。 我们只给一个VIEW命令和URI给person / place / event,它会自动把我们带到正确的活动。 当然,发起的活动掩盖了标签的观点,而不是出现在内部,但是我们愿意与此相适应。

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

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

在前进的任何build议将非常感激。 我们是Android的新手,所以我们试图遵循既定的最佳实践,但是当我们看到的一些例子对我们的用例来说过于简单时,很难。

Solutions Collecting From Web of "Android – 选项卡,地图视图,标签内的活动"

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

作为反活动选举联盟(AATA)的自主任总统,这当然是我的立场。

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

请注意,这与作为标签内容的活动无关。

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

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

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

这跟你之前写的不一样。 您的“后退事件”不会在使用视图作为标签的内容和使用“活动”作为标签的内容之间改变一个iota。 而且,这与你描述的“松散耦合”模式没有任何关系 – 点击标签视图中的列表中的图标与点击活动中的视图列表中的图标没有什么不同一个标签。

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

现在,如果您尝试彻底检查您的应用程序,那么在选项卡中导航不会启动其他活动,而是将内容保存在其自己的选项卡中…这是一个完整的“一堆鱼”。

有一个活动和多个视图为您的标签是一个很好的做法。 但是,这意味着你必须小心处理select哪个标签,每个标签视图的不同菜单和上下文菜单等。

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

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

基础知识是要有一个类似于HelloTabWidget教程中的布局,让您的活动从MapActivity扩展,从XML中提取tabhost,并确保在tabhost上调用setup()。 之后,添加视图作为标签,标签监听器等的内容是相同的。

这是这个class级的一个简短的起点:

 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; } })); } 

例如,不可能启动一个新的活动,并且在一个标签中取代现有的活动,而用不同的视图切换一个视图是可能的。

我不认为这是不可能的。 我尝试了这个想法,写了一篇博客文章来解释我做了什么。 我在文章的最后列出了一个示例代码项目,演示了我学到的一些有趣的东西。