更新安卓标签图标

2022-09-01 00:56:57

我有一个活动,它有一个 TabHost,其中包含一组 TabSpecs,每个 TabSpecs 都有一个列表视图,其中包含选项卡要显示的项目。创建每个 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();

有没有办法替换正在显示的图标,而无需删除和重新创建所有选项卡?


答案 1

简短的回答是,你没有错过任何东西。Android SDK 不提供在创建后更改指标的直接方法。仅用于构建选项卡,因此事后更改将不起作用。TabHostTabSpecTabSpec

不过,我认为有一个解决方法。调用以获取对象。这只是 的子类,因此您可以调用和访问 中的各个选项卡。这些选项卡中的每一个也是一个视图,对于具有图形指示器和文本标签的选项卡,几乎可以肯定是包含 和 .因此,只需稍微摆弄调试器或,您应该能够找出一个配方来获取并直接更改它。mTabs.getTabWidget()TabWidgetViewGroupgetChildCount()getChildAt()TabWidgetViewGroupLinearLayoutImageViewTextViewLog.iImageView

缺点是,如果你不小心,选项卡中控件的确切布局可能会更改,你的应用可能会中断。您的初始解决方案可能更健壮,但随后它可能会导致其他不必要的副作用,例如闪烁或聚焦问题。


答案 2

只是为了确认多米尼克的答案,这是他在代码中的解决方案(实际上有效):

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()中使用那些直接索引根本不好......


推荐