更新Android标签图标

时间:2020-03-05 18:45:40  来源:igfitidea点击:

我有一个活动,该活动的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中的各个选项卡。每个选项卡也是一个视图,对于带有图形指示符和文本标签的选项卡,几乎可以肯定的是,其他一些" ViewGroup"(也许是" LinearLayout",但没关系)包含一个ImageView和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()中使用这些直接索引根本不是很好。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

回答

请参阅我的带有有关自定义Android标签的代码示例的帖子。

谢谢
点数

回答

可能会有点晚了,但我们可能想看看这个Google Group主题