http://www.aslibra.com/blog/post/TabHost_addTab_TabSpec_change_icon.php
做了个tab形式的界面,但一直找不到系统提供的接口怎么修改图标,因为当前选择的和未选择的会改变。
添加tab的代码其实很简单
TabHost mTabHost = getTabHost();
TabHost.TabSpec tab_category = mTabHost.newTabSpec(tab_tag[0]);
tab_category.setIndicator(tabIndex[0], getResources().getDrawable(R.drawable.ic_tab_selected_contacts));
tab_category.setContent(R.id.layout_category);
mTabHost.addTab(tab_category);
//其它tab类似
//监听tab点击事件
mTabHost.setOnTabChangedListener(this);
setIndicator可以设置tab的标题和图标。
可是,会发现个问题,onTabChanged函数里,并不能如自己想的那样改变icon:
比如,你找到tab_category对象后,这样的操作无效:
tab_category.setIndicator(tabIndex[0], getResources().getDrawable(R.drawable.ic_tab_unselected_contacts));
这挺烦人的,可也不是没有办法,很难得居然搜到了答案:
引用
The short answer is, you're not missing anything. The Android SDK doesn't provide a direct method to change the indicator of a TabHost after it's been created. The TabSpec is only used to build the tab, so changing the TabSpec after the fact will have no effect.
I think there's a workaround, though. Call mTabs.getTabWidget() to get a TabWidget object. This is just a subclass of ViewGroup, so you can call getChildCount() and getChildAt() to access individual tabs within the TabWidget. Each of these tabs is also a View, and in the case of a tab with a graphical indicator and a text label, it's almost certainly some other ViewGroup (maybe a LinearLayout, but it doesn't matter) that contains an ImageView and a TextView. So with a little fiddling with the debugger or Log.i, you should be able to figure out a recipe to get the ImageView and change it directly.
The downside is that if you're not careful, the exact layout of the controls within a tab could change and your app could break. Your initial solution is perhaps more robust, but then again it might lead to other unwanted side effects like flicker or focus problems.
不翻译了,我的英文并不是很好,大家参考一下就好。
大致是说的TabSpec并没有提供方法修改icon,但此是View的扩展类,可以根据组织规律找到该icon的,就可以改掉它了。
还有示例代码:
tabHost.setOnTabChangedListener(new OnTabChangeListener() {
public void onTabChanged(String tabId) {
if (TAB_MAP.equals(tabId)) {
ImageView iv = (ImageView)tabHost.getTabWidget().getChildAt(0).findViewById(android.R.id.icon);
iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_map_black));
iv = (ImageView)tabHost.getTabWidget().getChildAt(1).findViewById(android.R.id.icon);
iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_list_white));
} else if (TAB_LIST.equals(tabId)) {
ImageView iv = (ImageView)tabHost.getTabWidget().getChildAt(0).findViewById(android.R.id.icon);
iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_map_white));
iv = (ImageView)tabHost.getTabWidget().getChildAt(1).findViewById(android.R.id.icon);
iv.setImageDrawable(getResources().getDrawable(R.drawable.tab_list_black));
}
}
});
这个代码阿权证实是可行的,很高兴能够实现自己的想法!
参考网址: Updating Android Tab Icons
原创内容如转载请注明:来自 阿权的书房
本帖地址:http://www.aslibra.com/blog/post/TabHost_addTab_TabSpec_change_icon.php
分享到:
相关推荐
在Android开发中,TabHost是一个非常实用的组件,它允许我们创建带有多个选项卡的应用界面,每个选项卡可以展示不同的内容或活动。本篇文章将详细介绍如何在Android项目中使用TabHost,以及它的工作原理。 首先,...
在Android应用开发中,TabHost是一个非常重要的组件,它用于创建多标签的界面,让用户能够通过不同的标签页浏览和切换不同的功能或内容。本示例是关于如何在Android中实现嵌套的TabHost,即两个层级的TabHost,类似...
本文实例分析了Android TabHost选项卡标签图标始终不出现的解决方法。分享给大家供大家参考,具体如下: 在学习Android TabHost布局过程中,很多教程告诉我,这样来显示选项卡标签的图标和文字: TapSpec spec1 = ...
在Android应用开发中,TabHost是一个非常重要的组件,它允许我们创建带有多个选项卡的应用界面。这个组件在早期的Android版本中广泛使用,为用户提供了一种便捷的方式来组织和切换不同的视图或活动。本文将深入探讨...
在Android开发中,TabHost是实现标签栏切换界面的一个关键组件。TabHost允许开发者创建一个具有多个Tab的界面,每个Tab都可以关联到不同的布局或活动(Activity),为用户提供直观的多视图导航体验。本文将深入讲解...
5. **自定义外观**:为了使TabHost符合应用的UI设计,我们可以自定义标签的样式,包括文字颜色、背景色、图标等。这通常通过创建自定义的TabIndicator布局并设置到TabSpec中完成。 在"TabhostDemos"压缩包中,可能...
在Android应用开发中,`TabHost` 是一个非常重要的组件,它用于实现多标签页的界面切换,类似于微信、QQ等应用的主界面布局。在本项目中,我们将深入探讨如何利用 `TabHost` 实现类似微信的界面切换效果。 首先,`...
在Android开发中,TabHost组件是一个非常实用的控件,用于创建带有标签页的应用界面,让用户可以在多个功能之间轻松切换。本文将详细讲解如何使用TabHost,并通过实例代码进行演示。 首先,TabHost的核心组成部分...
在Android应用开发中,TabHost是一个非常重要的组件,它用于创建多标签的用户界面,使得用户可以在不同的功能之间轻松切换。TabHost与TabWidget和FrameLayout一起工作,为每个标签提供一个视图容器。本教程将深入...
在Android开发中,TabHost是实现底部导航栏(Tab Bar)的一种传统方式,它允许用户在不同的内容区域之间切换,通常用于多视图的应用设计。本文将深入探讨如何使用TabHost来实现在Android应用底部显示选项卡的功能。 ...
在Android开发中,TabHost控件是一个非常重要的组件,它被用来实现标签页式界面,让用户可以在多个视图之间切换,提升应用的交互体验。TabHost通常与TabWidget和FrameLayout一起使用,创建一个带有可点击标签的界面...
在Android开发中,`TabHost`和`TabWidget`是两个关键组件,它们常用于创建具有多标签(或称为卡片)界面的应用。这样的设计允许用户通过点击不同的标签来浏览和切换不同的视图或功能模块。下面我们将深入探讨这两个...
在Android应用开发中,TabHost是一个非常常用的组件,它用于创建具有多个标签页的应用界面,每个标签页可以关联一个不同的Activity或Fragment。然而,在实际开发过程中,特别是在使用较大的图标(如48x48像素)时,...
3. **添加Tab**:使用TabHost的addTab()方法为每个Tab添加内容,包括标签文字、图标以及关联的Intent。 ```java TabSpec tabSpec = tabHost.newTabSpec("标签名"); tabSpec.setIndicator("标签名", res.getDrawable...
3. 添加Tab:使用TabHost的newTabSpec()方法创建TabSpec,然后设置标签文本、图标和对应的内容。最后使用addTab()方法将TabSpec添加到TabHost中。 ```java TabSpec spec = tabHost.newTabSpec("tag1"); spec....
3. **添加Tab**:使用`tabHost.newTabSpec()`方法创建TabSpec对象,然后设置标签文本、图标以及关联的Intent。Intent通常是一个指向Activity的启动动作,当用户点击该选项卡时,对应的Activity会被启动。例如: ```...
在Android开发中,TabHost是实现标签栏布局的重要组件,它是Android SDK提供的一种原生UI控件,用于创建带有多个选项卡的应用界面。这个“android tabhost --android UI源码.rar”压缩包文件包含了关于如何使用...
在Android应用开发中,TabHost是一个非常重要的组件,它用于创建多标签的用户界面,让用户可以在不同的视图间切换,从而实现类似浏览器的导航体验。本项目源码着重展示了如何利用TabHost构建复杂的Android UI。以下...
在Android应用开发中,TabHost是一个非常重要的组件,用于创建具有多个标签(Tab)的用户界面,每个标签可以展示不同的内容或功能。TabHost通常与TabWidget结合使用,为用户提供一种便捷的方式来切换不同的视图。...
在Android开发中,TabHost是实现标签栏切换界面的一个核心组件。它允许用户在不同的视图之间进行导航,每个视图通常对应一个Activity或者Fragment。TabHost与TabWidget(显示标签)和FrameLayout(用于显示内容)相...