`
libo19881179
  • 浏览: 266633 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【so easy】Tabhost每个tab中放入多个Activity!

阅读更多

最近做完了一个客户端项目

外面是个tabhost(用于底部tab栏)每个tab中有一个Activity,这个很普遍。

但有时需要每个tab中有多个页面,也就是说需要 在一个tab中跳转不同的Activity。

当时,我只是简单的在一个Activity中使用了动态布局 (设置layout是否显示)

虽然效果还不错,但实际上依然是同一个Activity,这样的缺点是代码结构会相对复杂,不易维护

今天在网上看到了一篇文章,原文是http://united-coders.com网站的http://united-coders.com/nico-heid/use-android-activitygroup-within-tabhost-to-show-different-activity

特意留下来 供大家和自己以后使用:

 

 

Use Android ActivityGroup within TabHost to show different Activity

 

 

For that reason you need a ActivityGroup within the Tab where you want to change the Activity.
An ActivityGroup is: A screen that contains and runs multiple embedded activities.

Let's look at this at a real life example. An Android app that shows your podcasts. In the first Activity you get to see all podcasts by subscription. If you touch the subscription, you see the single podcasts you've downloaded for that subscription.

The Tabhost contains three tabs, one for the MediaPlayer, one for the archive and one for available downloads.

  1.         TabHost tabHost = getTabHost();
  2.  
  3.         tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("Player").setContent(
  4.                 new Intent(this, PlayerActivity.class)));
  5.         tabHost.addTab(tabHost.newTabSpec("tab2").setIndicator("Archive").setContent(
  6.                 new Intent(this, ArchiveGroup.class)));
  7.         tabHost.addTab(tabHost.newTabSpec("tab3").setIndicator("Updates").setContent(
  8.                 new Intent(this, DownloadList.class)));

 

The ArchiveGroup takes care which Activity is shown in the second tab. With setContentView you can bring the View to the front.

  1.         View view = getLocalActivityManager().startActivity("ArchiveActivity",
  2.                 new Intent(this, ArchiveActivity.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();
  3.        
  4.         setContentView(view);

 

Now all you need to do is to bring another View to the front after an action is triggered. In this case, after a ListItem is clicked.

  1.         String album = (String) getListView().getItemAtPosition(position);
  2.         Intent intent = new Intent(getApplicationContext(), ArchiveAlbums.class);
  3.         intent.putExtra("album", album);
  4.         intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  5.        
  6.         View view = ArchiveGroup.group.getLocalActivityManager().startActivity("ShowPodcasts", intent).getDecorView();
  7.        
  8.         ArchiveGroup.group.setContentView(view);


You need to tell the ActivityGroup which view is to be on top and set the appropriate Flag, so that the View will be on top.

 

Of course now you have to keep track which activity is in front, how they behave and what happens if the back button is pressed. But that gives you room for customizing the behavior.

The full code can be found on github in the GpodRoid project.

Another good tutorials are by H. Larsen and Eric Harlow.

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics