- 浏览: 124848 次
- 性别:
- 来自: 深圳
最新评论
-
T_bag:
...
TabHost 中的Activity执行顺序 -
ihopethatwell:
楼主,你能否写一个 int类型的一维数组的结构体?
linux NDK实例 -
gf_crazy:
刚好找第二种,其他地方全是第一种。
TabHost -
gangbener:
我们是可以把不同分辨率的图片放到不同的图片文件夹中去,问题是: ...
android程序中屏幕问题解决方案 -
shusanzhan:
学习了,Mark
android应用收费渠道
最近在使用TabHost的时候遇到一个问题:
TabHost添加了4个Activity作为tab页面,我们从左至右的顺序称呼它们为tab1,tab2,tab3,tab4。可是每次进入TabHost页面的时候,不管我进来的时候点击的是指向哪个Activity的跳转,tab1的Activity总会首先被执行。可是我希望的效果是,我点击tab2的跳转,我就只希望执行tab2的Activity。
分析:我看了一下TabHost 2.1的源码,找到addTab方法,如下所示。
/**
* Add a tab.
* @param tabSpec Specifies how to create the indicator and content.
*/
public void addTab(TabSpec tabSpec) {
if (tabSpec.mIndicatorStrategy == null) {
throw new IllegalArgumentException("you must specify a way to create the tab indicator.");
}
if (tabSpec.mContentStrategy == null) {
throw new IllegalArgumentException("you must specify a way to create the tab content");
}
View tabIndicator = tabSpec.mIndicatorStrategy.createIndicatorView();
tabIndicator.setOnKeyListener(mTabKeyListener);
// If this is a custom view, then do not draw the bottom strips for
// the tab indicators.
if (tabSpec.mIndicatorStrategy instanceof ViewIndicatorStrategy) {
mTabWidget.setDrawBottomStrips(false);
}
mTabWidget.addView(tabIndicator);
mTabSpecs.add(tabSpec);
if (mCurrentTab == -1) {
setCurrentTab(0);
}
}
重点看最后两句代码,当变量mCurrentTab 等于-1的时候,就setCurrentTab(0);然后再找到mCurrentTab 变量,发现它的声明如下:
protected int mCurrentTab = -1;
通过上面的情况,我推测是因为变量mCurrentTab 的赋值的情况,导致执行addTab的方法的时候,会执行setCurrentTab(0);方法,这样第一个Activity就会被首先执行。并且第一次调用addTab添加的Activity总会被执行。
解决方法:
根据上面的情况,利用反射机制对TabHost 的变量mCurrentTab 的赋值进行控制,就可以实现对于Activity的独立访问。分为2步。
第一步:将mCurrentTab 的值改为非-1,这些代码要在addTab方法调用之前写,这样防止addTab方法的最后两句代码执行。如下:
try
{
Field idcurrent = tabHost.getClass()
.getDeclaredField("mCurrentTab");
idcurrent.setAccessible(true);
idcurrent.setInt(tabHost, -2);
}
catch (Exception e)
{
e.printStackTrace();
}
第二步:在addTab方法执行之后修改mCurrentTab 的值,这样是为了调用setCurrentTab方法时正常执行,如下:
try
{
Field idcurrent = tabHost.getClass()
.getDeclaredField("mCurrentTab");
idcurrent.setAccessible(true);
if (tadid == 0)
{
idcurrent.setInt(tabHost, 1);
}
else
{
idcurrent.setInt(tabHost, 0);
}
}
catch (Exception e)
{
e.printStackTrace();
}
最后,把上述的整体的一个功能代码写一下:
//取得想跳转到的的tab的Id
Bundle extras = getIntent().getExtras();
Resources resources = getResources();
String defaultTab = extras.getString(STARTING_TAB);
int tadid = defaultTab == null ? 2 : Integer.valueOf(defaultTab);
//设置mCurrentTab为非-1,addtab时候不会进入setCurrentTab()
try
{
Field idcurrent = tabHost.getClass()
.getDeclaredField("mCurrentTab");
idcurrent.setAccessible(true);
idcurrent.setInt(tabHost, -2);
}
catch (Exception e)
{
e.printStackTrace();
}
Intent Intent1= new Intent(this,Activity1.class);
Intent1.putExtras(extras);
tabHost.addTab(tabHost.newTabSpec(Intent1_TAB).setIndicator(
resources.getString(R.string.Intent1)).setContent(
Intent1));
Intent Intent12= new Intent(this, Activity2.class);
Intent12.putExtras(extras);
tabHost.addTab(tabHost.newTabSpec(Intent12_TAB).setIndicator(
resources.getString(R.string.Intent12)).setContent(
Intent12));
Intent Intent13= new Intent(this, Activity3.class);
Intent13.putExtras(extras);
tabHost.addTab(tabHost.newTabSpec(Intent13_TAB).setIndicator(
resources.getString(R.string.Intent13)).setContent(
Intent13));
//设置mCurrentTab与tadid不同,并且不能数组越界(0-2),保证第一次进入tab的setCurrentTab()方法正常运行
try
{
Field idcurrent = tabHost.getClass()
.getDeclaredField("mCurrentTab");
idcurrent.setAccessible(true);
if (tadid == 0)
{
idcurrent.setInt(tabHost, 1);
}
else
{
idcurrent.setInt(tabHost, 0);
}
}
catch (Exception e)
{
e.printStackTrace();
}
//进入传来的选项卡
tabHost.setCurrentTab(tadid);
from:http://www.eoeandroid.com/thread-39870-1-1.html
发表评论
-
android.os.NetworkOnMainThreadException
2011-12-24 13:14 1235不能在android的主线程中,执行一个网络操作 ... -
转载:为什么要对URI进行编码
2011-12-15 15:49 1078为什么需要Url编码,通常如果一样东西需要编码,说明这样东 ... -
multipart form-data boundary
2011-12-15 15:23 1023含义 ENCTYPE="multipart/ ... -
android http 附件
2011-12-15 14:17 1663一:服务器端: 1:struts-config.xml ... -
post 附件
2011-12-15 10:24 1007在做嘀咕客户端的时候,要实现拍照上传的功能。根据嘀咕api ... -
让Android应用获取系统权限
2011-12-08 18:46 1004在 android 的API中有提供 SystemCloc ... -
Android源码目录结构详解
2011-12-01 20:22 850Android 2.1 |-- Makefile |-- ... -
两个activity跳转
2011-11-25 16:06 1279Activity A跳转到 Activity B /**A. ... -
线程同步之wait()/notify()的使用
2011-11-21 11:24 1002wait()/notify() 通常,多 ... -
游戏中渲染线程与更新线程交替执行
2011-11-21 11:21 945private final State mThreadLock ... -
android colormatrix
2011-11-03 17:32 1498在编程中有时候需要 ... -
java栈,堆,池
2011-07-08 09:38 752今天复习了一下这些知识,顺便做了下笔记.1.寄存器:最快的存储 ... -
3D开发的境界
2011-06-04 20:12 705第一阶段:初学者阶 ... -
Http
2011-06-01 17:10 1312使用 HTTP 服务: 1. Apache HttpCline ... -
获取手机的Opengl的支持版本
2011-05-27 09:28 1464public int getGLVersion() { ... -
性能优化
2011-05-27 09:26 791如果你想写一个 Java 程序,观察某对象什么时候会被垃圾收集 ... -
Android游戏中其他语言数据类型之间的转换方法
2011-05-17 11:43 1236Java与其他语言数据类型之间的转换方法实例程序 /* ... -
android canvas.getClipBounds
2011-05-13 17:41 8439一种是传参数: Rect dstRect = new Re ... -
获取屏幕大小的方法
2011-05-13 17:38 604// one DisplayMetrics dm = n ... -
Android Lock 使用
2011-05-13 16:43 3210PowerManager 和PowerManager.Wa ...
相关推荐
在TabHost中,每个Tab通常会对应一个独立的Activity,这样当用户切换Tab时,Android系统会启动或恢复相应的Activity,呈现出对应的功能界面。 **SlidingMenu**: SlidingMenu是一个Android库项目,用于实现侧滑菜单...
在Android应用开发中,TabHost是一个非常常用的组件,它用于创建具有多个标签(Tab)的界面,每个标签对应一个不同的Activity。本篇文章将详细介绍如何通过自定义TabHost来实现Activity之间的跳转,以及如何设计一个...
总结,TabHost加载Activity和自定义底部导航栏是Android开发中常见的界面设计模式。通过合理的配置和事件处理,可以构建出功能丰富的、用户体验良好的多页面应用。同时,自定义底部导航栏不仅可以增强应用的视觉效果...
在Android应用开发中,构建一个用户友好的界面是至关重要的,而Tabhost和Activity的结合使用正是为了实现这种多页面、多功能的交互设计。Tabhost是Android提供的一种用于创建带有选项卡界面的组件,它允许用户通过...
在Android应用开发中,"Android例子源码tabhost+activity+slidingMenu"是一个常见的应用场景,主要用于构建类似微博客户端的用户界面。这个示例代码集成了TabHost、Activity和SlidingMenu三个关键组件,让我们来深入...
在Android开发中,TabHost是一个非常重要的组件,它允许开发者在一个Activity中创建多个Tab来展示不同的界面。TabHost结合TabWidget(用于显示标签)和FrameLayout(用于显示内容)一起工作,提供了一种用户友好的多...
它可以通过简单的API集成到现有的Activity中,并允许自定义菜单内容、滑动效果等。 在"tabhost+activity+slidingmenu布局框架.zip"的压缩包中,可能包含了以下文件和资源: - `MenuTab`:这可能是主Activity的名称...
默认情况下,当在子Activity中启动另一个Activity并返回结果时,OnActivityResult()方法不会在子Activity中被调用,而是会在启动这个子Activity的父Activity中被调用。这可能不符合我们期望的行为,尤其是在需要在子...
- 使用 `TabHost.addTab()` 将 `TabSpec` 添加到 `TabHost` 中,并指定每个 `TabSpec` 对应的 `Activity`。 - 最后,调用 `TabHost.setup()` 准备 `TabHost`,并启动第一个 `Activity`。 在名为 `TabDesign02` 的...
`TabHost`是Android SDK中用于实现标签栏界面的组件,它允许你在应用的顶部创建一个可切换的标签栏,每个标签对应一个不同的活动(Activity)。`TabHost`包含两个主要部分:`TabWidget`(显示标签)和`FrameLayout`...
2. 在`TabHost.addTab()`方法中,将这个Activity或Fragment关联到`TabSpec`。 例如,如果你使用Activity,可以这样设置: ```java Intent intent = new Intent(this, ListViewActivity.class); TabSpec tabSpec = ...
它允许你在同一个Activity中展示多个不同的视图或Fragment,每个视图代表一个标签页。TabHost通常包含一个TabWidget(用于显示和选择标签)和一个FrameLayout(用于显示当前选中的标签内容)。在源码中,TabHost可能...
在某些情况下,使用Fragment替代Activity可能是更好的选择,因为Fragment可以在同一个Activity中进行切换,且不会引发生命周期问题。但如果你的应用场景确实需要独立的Activity,那么这个方法就非常适用了。
自Android3.2之后,TabActibvity被弃用(Deprecated),取而代之的是FragmentActivity,因为Fragment...原来的TabActibvity+TabHost+Activity那套还可以用,不过强烈建议改用FragmentActivity+FragmentTabHost+Fragement
Fragment可以像Activity一样拥有自己的UI和生命周期,而且可以在同一个Activity中进行动态添加、删除和替换,解决了ActivityGroup的一些问题,同时也更符合Android设计原则。 在升级到使用Fragment时,需要注意以下...
Fragment可以嵌套在Activity中,也可以在同一个Activity中动态地添加、移除和替换,更加灵活且易于维护。 综上所述,"TabHost内嵌ActivityGroup界面管理源码.zip"这个压缩包文件可能包含了一个使用旧版Android界面...
在Android开发中,"tabhost activity slidingMenu仿新浪微博布局.zip"是一个典型的移动应用界面设计案例,它结合了TabHost和SlidingMenu组件来模仿新浪微博的用户界面。这个小框架展示了如何构建一个具有底部标签...
当时,我只是简单的在一个Activity中使用了动态布局 (设置layout是否显示) 虽然效果还不错,但实际上依然是同一个Activity,这样的缺点是代码结构会相对复杂,不易维护 今天在网上看到了一篇文章,原文是...
在Android开发中,TabHost是一个非常重要的组件,它允许我们创建具有多个标签(Tab)的界面,每个标签对应一个不同的活动(Activity)或视图(View)。本文将深入讲解如何在Android应用程序中有效地使用TabHost。 ...
3. 当用户在主TabHost中选择一个标签时,启动对应的子Activity或Fragment,并显示其内的TabHost。 4. 子TabHost的创建和设置与主TabHost相似,只是它们的生命周期与主TabHost中的标签关联,当用户切换主TabHost的...