TabHost_新的Activity仍然持有Tab_Tab内跳转新的Activity
问题:
TabHost内的一个页面例如tab3,如果startActivity跳入新页面,则新页面是没有Tab栏的。而很多需求和蹩脚的产品非得这么搞(而且tab栏居然不能是样式不变的)。
解决方法:
用ActivityGroup,以LocalActivityManager(而这个类已经被deprecated了,参考这里官方文档)来管理当前的页面的显示和历史页面的切换。
其他问题:
Tab内很多页面跳转,有些如果不作处理,又会跳出本Tab。
比如tab3的页面A,跳入页面B,跳入页面C,C此时已经和页面A失去了联系,如果再调准,怎么能够仍在页面A的group管理范围内呢?
可以作singleton处理,或者其他共享方式,比如static的共享变量,虽然说这样不太好。
import java.util.ArrayList; import android.app.Activity; import android.app.ActivityGroup; import android.app.LocalActivityManager; import android.content.Intent; import android.os.Bundle; import android.view.KeyEvent; import android.view.Window; /* * The purpose of this Activity is to manage the activities in a tab. * Note: Child Activities can handle Key Presses before they are seen here. * @author Eric Harlow */ public class TabGroupActivity extends ActivityGroup { private ArrayList<String> mIdList; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (mIdList == null) mIdList = new ArrayList<String>(); } /* * This is called when a child activity of this one calls its finish method. * This implementation calls {@link LocalActivityManager#destroyActivity} on the child activity * and starts the previous activity. * If the last child activity just called finish(),this activity (the parent), * calls finish to finish the entire group. */ @Override public void finishFromChild(Activity child) { LocalActivityManager manager = getLocalActivityManager(); int index = mIdList.size()-1; if (index < 1) { finish(); return; } manager.destroyActivity(mIdList.get(index), true); mIdList.remove(index); index--; String lastId = mIdList.get(index); Intent lastIntent = manager.getActivity(lastId).getIntent(); Window newWindow = manager.startActivity(lastId, lastIntent); setContentView(newWindow.getDecorView()); } /* * Starts an Activity as a child Activity to this. * @param Id Unique identifier of the activity to be started. * @param intent The Intent describing the activity to be started. * @throws android.content.ActivityNotFoundException. */ public void startChildActivity(String Id, Intent intent) { Window window = getLocalActivityManager().startActivity(Id,intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)); if (window != null) { mIdList.add(Id); setContentView(window.getDecorView()); } } /* * The primary purpose is to prevent systems before android.os.Build.VERSION_CODES.ECLAIR * from calling their default KeyEvent.KEYCODE_BACK during onKeyDown. */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { //preventing default implementation previous to android.os.Build.VERSION_CODES.ECLAIR return true; } return super.onKeyDown(keyCode, event); } /* * Overrides the default implementation for KeyEvent.KEYCODE_BACK * so that all systems call onBackPressed(). */ @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { onBackPressed(); return true; } return super.onKeyUp(keyCode, event); } /* * If a Child Activity handles KeyEvent.KEYCODE_BACK. * Simply override and add this method. */ @Override public void onBackPressed () { int length = mIdList.size(); if ( length >=1) { Activity current = getLocalActivityManager().getActivity(mIdList.get(length-1)); current.finish(); } } }
此类的使用 方法:
public class Tab_BookCityActivity extends TabGroupActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); startChildActivity("BookCityActivity", new Intent(this, BookCityActivity.class)); } }
参考资料:
Use Android ActivityGroup within TabHost to show different Activity
how to Keep Tabhost when start other activity
相关推荐
本文将详细介绍如何在`TabHost`同一个Tab内实现`Activity`之间的跳转。 首先,我们需要理解`TabHost`的基本结构。`TabHost`由两部分组成:`TabWidget`和`FrameLayout`。`TabWidget`负责显示选项卡,而`FrameLayout`...
总结来说,要解决“android tabhost tab内多个activity的跳转及返回”问题,你需要自定义TabHost的位置,通过监听Tab点击事件启动子Activity,并使用`startActivityForResult()`和`onActivityResult()`来处理返回...
本篇文章将详细介绍如何通过自定义TabHost来实现Activity之间的跳转,以及如何设计一个简洁但功能完备的界面。 首先,理解TabHost的基本结构至关重要。TabHost是一个容器,它包含一个TabWidget(标签栏)和一个...
有时需要每个tab中有多个页面,也就是说需要 在一个tab中跳转不同的Activity。 当时,我只是简单的在一个Activity中使用了动态布局 (设置layout是否显示) 虽然效果还不错,但实际上依然是同一个Activity,这样的...
在Android开发中,TabHost是一个非常重要的组件,用于创建具有多个Tab标签的界面,每个标签页可以关联到不同的Activity或View。本示例是关于如何使用TabHost实现单例模式的小例子,旨在帮助开发者理解如何在TabHost...
总结,TabHost是Android开发中实现多Tab界面的经典组件,虽然在新版本的Android中,更多地推荐使用ViewPager和TabLayout的组合,但对于理解Android的历史和各种实现方式,TabHost仍然是不可或缺的一部分。...
1. **使用 Intent.FLAG_ACTIVITY_CLEAR_TOP 标志**:在添加标签页时,可以在 `Intent` 中加入 `Intent.FLAG_ACTIVITY_CLEAR_TOP` 标志,该标志会确保每次切换时都会重新创建 Activity 实例,从而实现页面的刷新。...
参考了网上大虾们的例子,实现了tab 中的子Activity跳转,并且带有动画效果;这里没有抽取动画作为参数,也可以定制自己的跳转动画;tab bar 的外观可以自己定制,将自带的tab隐藏,控制自定义的view调用tab的动作就...
2. 如果使用Intent,记得使用`Intent.FLAG_ACTIVITY_CLEAR_TOP`标志,以确保当切换回已存在的Activity时,该Activity会被重新激活而不是创建新的实例。 3. 考虑使用`TabLayout`和`ViewPager`(Android Design ...
在“同一个tab内部实现多个activity的跳转”这一描述中,可能意味着每个Tab对应一个主Activity,而主Activity内可以根据用户的操作启动其他子Activity。这种情况下,可以使用Intent启动新Activity,或者在主Activity...
在内嵌ActivityGroup的TabHost中,每个tab下的界面不再是简单的View或者Fragment,而是整个Activity。这样,当用户在不同tab之间切换时,ActivityGroup会负责管理这些子Activity的创建、销毁和保存状态。 源码中,...
在Android开发中,TabHost组件是一个非常实用的控件,用于创建带有标签页的应用界面,让用户可以在多个功能之间轻松切换。本文将详细讲解如何使用TabHost,并...不过,了解TabHost仍然是理解Android UI体系的重要部分。
`创建一个新的`TabHost`实例,然后使用`tabHost.setup();`初始化它。 2. 添加选项卡:使用`tabHost.addTab()`方法来添加每个选项卡。这个方法需要传入四个参数:`TabSpec`(定义选项卡的属性)、`Intent`(与选项卡...
在早期的Android版本中,ActivityGroup用于在一个Tab内管理多个Activity的堆栈。它的主要作用是在不离开TabHost的情况下,实现内部Activity的切换和堆栈管理。然而,从Android 3.0(API级别11)开始,ActivityGroup...
在Android开发中,TabHost是一个非常重要的组件,用于创建具有多个Tab标签的界面,每个标签页可以关联不同的Activity或者Fragment,实现多视图间的切换。本教程将详细讲解如何利用TabHost结合ListView、ViewPager和...
在本场景中,"Android tab 左右可滑动跳转"的实现主要是通过结合这两个组件来完成的。 首先,我们需要引入必要的依赖库。在`build.gradle`文件中,确保你添加了以下依赖: ```gradle dependencies { ...
每个Tab都可以关联一个Intent,这个Intent可以启动一个新的Activity或者Fragment。在这个源码示例中,你可能会看到以下关键知识点: 1. **TabWidget**:这是TabHost中的一个组件,显示了各个Tab标签。开发者可以...
4. **交互处理**: 当用户点击`ListView`的项时,你可以监听`onItemClick`事件来处理用户的选择,比如跳转到新的详情页面或者执行其他操作。 ```java listView.setOnItemClickListener(new AdapterView....
这样,尽管用户实际上跳转到了新的Activity,但在视觉上他们仍能感知到是在当前`Tab`内的操作。 4. 使用`ViewModel`或`EventBus`进行通信:在更复杂的情况下,你可能需要在多个Activity之间传递数据或事件。这时,...