我有一个活动,其中包含一组TabSpec,每个TabSpec都有一个listview,其中包含选项卡要显示的项目.创建每个TabSpec时,我设置一个图标显示在选项卡标题中.
TabSpecs以这种方式在一个setupTabs()
循环创建适当数量的选项卡的方法中创建:
TabSpec ts = mTabs.newTabSpec("tab"); ts.setIndicator("TabTitle", iconResource); ts.setContent(new TabHost.TabContentFactory( { public View createTabContent(String tag) { ... } }); mTabs.addTab(ts);
有几个实例我希望能够在执行程序期间更改每个选项卡中显示的图标.目前我正在删除所有选项卡,并再次调用上面的代码来重新创建它们.
mTabs.getTabWidget().removeAllViews(); mTabs.clearAllTabs(true); setupTabs();
有没有办法替换正在显示的图标而不删除并重新创建所有选项卡?
简短的回答是,你没有遗漏任何东西.Android SDK不提供直接方法来更改TabHost
创建后的指标.将TabSpec
只用于建立标签,所以改变TabSpec
的事实后不会有任何效果.
不过,我认为有一种解决方法.打电话mTabs.getTabWidget()
来获取一个TabWidget
对象.这只是其中的一个子类ViewGroup
,因此您可以调用getChildCount()
和getChildAt()
访问其中的各个选项卡TabWidget
.这些选项卡中的每一个都是一个视图,对于带有图形指示符和文本标签的选项卡,几乎可以肯定其他一些ViewGroup
(可能是a LinearLayout
,但无关紧要)包含a ImageView
和a TextView
.因此,稍微调试一下调试器,或者Log.i
你应该能够找到一个方法来获取ImageView
并直接更改它.
缺点是,如果你不小心,选项卡中控件的确切布局可能会改变,你的应用程序可能会破坏.您的初始解决方案可能更强大,但同样可能会导致其他不需要的副作用,如闪烁或焦点问题.
只是为了确认支配回答,这是他在代码中的解决方案(实际上有效):
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)); } } });
当然它根本没有打磨,在getChildAt()中使用那些直接索引并不好看......
可能会有点晚,但你可能想看一下这个帖子
http://groups.google.com/group/android-developers/browse_thread/thread/ef3bdebcb715b385
请参阅我的帖子,其中包含有关自定义Android标签的代码示例.
谢谢Spct
这就是我所做的,它对我有用.我在从TabBarActivity扩展的活动中创建了此函数
public void updateTab(int stringID) { ViewGroup identifyView = (ViewGroup)getTabWidget().getChildAt(0); TextView v = (TextView)identifyView.getChildAt(identifyView.getChildCount() - 1); v.setText(stringID); }
您可以修改此功能以更改图像而不是文本,或者您可以更改它们,也可以修改此功能以获取任何标签子项.我特别感兴趣的是在运行时修改第一个选项卡的文本.
我使用此调用从相关活动调用此函数
getParent().updateTab(R.string.tab_bar_analyze);