更新Android标签图标
我有一个活动,该活动的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主题