更新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()中使用这些直接索引是不好的…
这可能有点晚,但你可能想看看这个线程
http://groups.google.com/group/android-developers/browse_thread/thread/ef3bdebcb715b385
看到我的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);
- 我怎样才能完全隐藏ExpandableListView的groupIndicator?
- Kotlin和新的ActivityTestRule:@规则必须公开
- 移动设备上的程序性屏幕截图
- 取消一个handler.postdelayed进程
- 如何获得响应作为string使用改造,而不使用GSON或Android中的任何其他库
- 如何在android / dalvik上dynamic加载Java类?
- CardView背景颜色始终为白色
- 将WebGL应用程序部署为本机iOS或Android应用程序?
- javax.net.ssl.SSLException:读取错误:ssl = 0x9524b800:系统调用期间发生I / O错误,由对等方重置连接