我有一个 Activity ,该 Activity 的TabHost包含一组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
中的各个选项卡。这些选项卡中的每个选项卡也是一个 View ,对于带有图形指示器和文本标签的选项卡,几乎可以肯定是其他一些ViewGroup
(也许是LinearLayout
,但没有关系)包含ImageView
和TextView
。因此,只要稍微调试一下调试器或Log.i
,您就应该能够找到一个配方来获取ImageView
并直接对其进行更改。
缺点是,如果您不小心,则选项卡中控件的确切布局可能会更改,并且您的应用程序可能会中断。您最初的解决方案可能更强大,但随后又可能导致其他不希望出现的副作用,例如闪烁或聚焦问题。