更新Android标签图标

时间:2008-08-31 14:36:12

标签: java android android-tabhost

我有一个活动,其中一个TabHost包含一组TabSpecs,每个TabSpecs都有一个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();

有没有办法替换正在显示的图标而不删除并重新创建所有标签?

7 个答案:

答案 0 :(得分:32)

简短的回答是,你没有遗漏任何东西。 Android SDK不提供在创建TabHost后更改指示符的直接方法。 TabSpec仅用于构建标签,因此在事后更改TabSpec将无效。

我认为有一种解决方法。致电mTabs.getTabWidget()以获取TabWidget个对象。这只是ViewGroup的子类,因此您可以调用getChildCount()getChildAt()来访问TabWidget中的各个标签。这些选项卡中的每一个也都是一个视图,对于带有图形指示符和文本标签的选项卡,几乎可以肯定其他ViewGroup(可能是LinearLayout,但这并不重要)包含ImageViewTextView。因此,稍微调试调试器或Log.i,您应该能够找到一个获取ImageView的配方并直接更改它。

缺点是,如果你不小心,选项卡中控件的确切布局可能会改变,你的应用程序可能会破坏。您的初始解决方案可能更强大,但同样可能会导致其他不需要的副作用,如闪烁或焦点问题。

答案 1 :(得分:30)

只是为了确认支配者的答案,这是他在代码中的解决方案(实际上有效):

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

答案 2 :(得分:10)

答案 3 :(得分:6)

请参阅我的帖子,其中包含有关Customized Android Tabs的代码示例。

由于 SPCT

答案 4 :(得分:5)

这就是我所做的,它对我有用。我在从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);

答案 5 :(得分:4)

试试这个:

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

答案 6 :(得分:0)

我们可以使用线程 看这个链接

http://groups.google.com/group/android-developers/browse_thread/thread/ef3bdebcb715b385