我有一个 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,但没有关系)包含ImageViewTextView 。因此,只要稍微调试一下调试器或Log.i,您就应该能够找到一个配方来获取ImageView并直接对其进行更改。

缺点是,如果您不小心,则选项卡中控件的确切布局可能会更改,并且您的应用程序可能会中断。您最初的解决方案可能更强大,但随后又可能导致其他不希望出现的副作用,例如闪烁或聚焦问题。

09-26 09:07