Android美化TabWidget详细代码
android默认的tabwidget是置顶的,有时放在下面比较好看,但是使用默认的tabwidget放在下面看上去效果非常不好看,由此对其美化一下。设置其背景,以及选中的tab和未被选中的tab差异化,同时去掉了烦人了白线,同时对被选中和未被选中的标签进行区别,效果还可以。看代码。
预先准备好几个资源文件,然后在extends TabActivity的那个class中加进这个函数,找个地方调用它,就OK了。
//记得先定义这几个变量 private TabHost tabHost; private TabWidget tabWidget; Field mBottomLeftStrip; Field mBottomRightStrip; public TabHost makeTab(){ if(this.tabHost == null){ tabHost = (TabHost)findViewById(android.R.id.tabhost); tabWidget = (TabWidget)findViewById(android.R.id.tabs); tabHost.setup(); tabHost.bringToFront(); TabSpec nearby_tab = tabHost.newTabSpec("nearby_tab"); TabSpec history_tab = tabHost.newTabSpec("history_tab"); TabSpec about_tab = tabHost.newTabSpec("about_tab"); nearby_tab.setIndicator("first",getResources().getDrawable(R.drawable.first)).setContent(new Intent(this,first.class)); history_tab.setIndicator("second",getResources().getDrawable(R.drawable.second)).setContent(new Intent(this,second.class)); about_tab.setIndicator("third",getResources().getDrawable(R.drawable.third)).setContent(new Intent(this,third.class)); tabHost.addTab(nearby_tab); tabHost.addTab(history_tab); tabHost.addTab(about_tab); if (Integer.valueOf(Build.VERSION.SDK) <= 7) { try { mBottomLeftStrip = tabWidget.getClass().getDeclaredField ("mBottomLeftStrip"); mBottomRightStrip = tabWidget.getClass().getDeclaredField ("mBottomRightStrip"); if(!mBottomLeftStrip.isAccessible()) { mBottomLeftStrip.setAccessible(true); } if(!mBottomRightStrip.isAccessible()){ mBottomRightStrip.setAccessible(true); } mBottomLeftStrip.set(tabWidget, getResources().getDrawable (R.drawable.linee)); mBottomRightStrip.set(tabWidget, getResources().getDrawable (R.drawable.linee)); } catch (Exception e) { e.printStackTrace(); } } else { try { mBottomLeftStrip = tabWidget.getClass().getDeclaredField("mLeftStrip"); mBottomRightStrip = tabWidget.getClass().getDeclaredField("mRightStrip"); if (!mBottomLeftStrip.isAccessible()) { mBottomLeftStrip.setAccessible(true); } if (!mBottomRightStrip.isAccessible()) { mBottomRightStrip.setAccessible(true); } mBottomLeftStrip.set(tabWidget, getResources().getDrawable(R.drawable.linee)); mBottomRightStrip.set(tabWidget, getResources().getDrawable(R.drawable.linee)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } for (int i =0; i <tabWidget.getChildCount(); i++) { final TextView tv = (TextView) tabWidget.getChildAt(i).findViewById(android.R.id.title); tv.setTextColor(Color.WHITE); View vvv = tabWidget.getChildAt(i); if(tabHost.getCurrentTab()==i){ vvv.setBackgroundDrawable(getResources().getDrawable(R.drawable.focus)); } else { vvv.setBackgroundDrawable(getResources().getDrawable(R.drawable.unfocus)); } } tabHost.setOnTabChangedListener(new OnTabChangeListener(){ @Override public void onTabChanged(String tabId) { // TODO Auto-generated method stub for (int i =0; i < tabWidget.getChildCount(); i++) { View vvv = tabWidget.getChildAt(i); if(tabHost.getCurrentTab()==i){ vvv.setBackgroundDrawable(getResources().getDrawable(R.drawable.focus)); } else { vvv.setBackgroundDrawable(getResources().getDrawable(R.drawable.unfocus)); } } } }); } else{ return tabHost; } return null; }
用到的布局xml文件内容如下:
<TabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/tabhost" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1"> </FrameLayout> <TabWidget android:id="@android:id/tabs" android:layout_width="fill_parent" android:layout_alignParentBottom="true" android:layout_height="wrap_content"/> </LinearLayout> </TabHost>
相关文章
上一篇: Android关闭所有Activity完全退出程序下一篇: 苹果系统显示隐藏文件切换脚本
大哥,文章很好,我正在学习,但是弄不清哪些用到的图片有什么效果,可不可麻烦您将代码中用到的几个 drawable 资源发到我邮箱上?非常感谢。
能有更详细的对比效果图么
@cheap quilts:你可以看一下一般的tab和美化后的tab对比
[...] http://sillydong.com/myjava/android-tabwidget.html [...]
能给个完全的代码么?包括图片资源
大哥,求完整代码
@cainiao:项目已经删了,你把文章里的代码贴到你项目里用的地方就行了。。。
我运行这个程序时,遇到这个问题:the application has stopped unexpectedly,好像与函数无关,因为我注释掉函数时,也有同样地错误,麻烦指导下~~~
@bob:你贴一下logcat里面的具体报错信息看看呢
能给我发一下这个例子吗?我的邮箱是:869516008@qq.com 谢谢啦@傻东
看了介绍,很受启发,有几个疑问想请教:代码中分离版本7以下和以上:其中有“mBottomLeftStrip,mBottomRightStrip”和“mLeftStrip,mRightStrip“,这个怎么理解?方便的话,求例子的代码一份,在此谢过:ttsttsttsttstts@sohu.com
@ttstts:7之前和之后的SDK对这两块的命名不一样,所以区分一下,代码已发,请查收
lz,写得真好,但有些地方我还是不懂,你能把源码也发我一份吗?非常感谢
楼主,能否发源代码给我的邮箱?学习 非常感谢!
可否提供代码,谢谢!
求源代码
37614819@qq.com
楼主能把例子发一份给我吗?学习一下。82181843@qq.com
你好,能给我也发一个么,小弟刚开始学习ANDROID的哦!
楼主能把例子发一份给我吗?学习一下。37132905@qq.com