English 中文(简体)
更新Android选项卡图标
原标题:
  • 时间:2008-08-31 14:36:11
  •  标签:

我有一个活动,它有一个TabHost,其中包含一组TabSpec,每个TabSpec都有一个列表视图,其中包含要由选项卡显示的项目。当创建每个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,但这无关紧要)包含ImageViewTextView。因此,只要稍微摆弄一下调试器或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选项卡

Thanks 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);

试试这个:

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));
        }
    }
});




相关问题