更新Android标签图标

我有一个活动,它有一个TabHost包含一组TabSpecs,每个TabSpec都有一个包含要由选项卡显示的项目的列表视图。 当每个TabSpec创build时,我设置一个图标显示在选项卡标题中。

TabSpecs在setupTabs()方法中以这种方式创build,该方法循环创build相应数量的选项卡:

 TabSpec ts = mTabs.newTabSpec("tab"); ts.setIndicator("TabTitle", iconResource); ts.setContent(new TabHost.TabContentFactory( { public View createTabContent(String tag) { ... } }); mTabs.addTab(ts); 

有一些情况下,我希望能够更改我的程序执行过程中显示在每个选项卡中的图标。 目前我正在删除所有的选项卡,并再次调用上面的代码重新创build它们。

 mTabs.getTabWidget().removeAllViews(); mTabs.clearAllTabs(true); setupTabs(); 

有没有办法replace正在显示的图标而不删除并重新创build所有的选项卡?

简而言之,你不会错过任何东西。 Android SDK没有提供一个直接的方法来改变TabHost创build后的指标。 TabSpec仅用于构build选项卡,因此在事实之后更改TabSpec将不起作用。

不过,我认为有一个解决办法。 调用mTabs.getTabWidget()来获取TabWidget对象。 这只是ViewGroup一个子类,因此您可以调用getChildCount()getChildAt()来访问TabWidget各个选项卡。 每个选项卡也是一个视图,对于带有graphics指示器和文本标签的选项卡,几乎可以肯定其他一些ViewGroup (也许是LinearLayout ,但没关系),它包含一个ImageView和一个TextView 。 因此,在debugging器或者Log.i稍微摆弄Log.i ,你应该能够找出一个配方来获取ImageView并直接改变它。

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

只是为了确认dominic的答案,这是他的代码解决scheme(实际工作):

 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()中使用这些直接索引是不好的…

看到我的post与自定义Android标签的代码示例。

感谢Spct

尝试这个:

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

这就是我所做的,对我来说很有用。 我在从TabBarActivity扩展的活动中创build了这个函数

 public void updateTab(int stringID) { ViewGroup identifyView = (ViewGroup)getTabWidget().getChildAt(0); TextView v = (TextView)identifyView.getChildAt(identifyView.getChildCount() - 1); v.setText(stringID); } 

你可以修改这个function来改变图像而不是文字,或者你可以改变这两个,也可以修改这个来获得任何标签子。 我特别感兴趣的是在运行时修改第一个标签的文本。

我使用这个调用从相关的活动中调用了这个函数

 getParent().updateTab(R.string.tab_bar_analyze);