我有一个活动,其中一个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();
有没有办法替换正在显示的图标而不删除并重新创建所有标签?
答案 0 :(得分:32)
简短的回答是,你没有遗漏任何东西。 Android SDK不提供在创建TabHost
后更改指示符的直接方法。 TabSpec
仅用于构建标签,因此在事后更改TabSpec
将无效。
我认为有一种解决方法。致电mTabs.getTabWidget()
以获取TabWidget
个对象。这只是ViewGroup
的子类,因此您可以调用getChildCount()
和getChildAt()
来访问TabWidget
中的各个标签。这些选项卡中的每一个也都是一个视图,对于带有图形指示符和文本标签的选项卡,几乎可以肯定其他ViewGroup
(可能是LinearLayout
,但这并不重要)包含ImageView
和TextView
。因此,稍微调试调试器或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)
可能有点晚,但你可能想看一下这个帖子
http://groups.google.com/group/android-developers/browse_thread/thread/ef3bdebcb715b385
答案 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