虽然网上有很多底部菜单栏的实现方式,但是实现方式各种各样,很多也不符合自己的口味,所以还是总结下底部菜单栏的实现方式,以便以后方便查询使用

实现方式一:通过TabWidget实现

这种方式主要是在布局中将TabWidget标签嵌套在RelativeLayout中,并且在TabWidget标签中中设置 android:layout_alignParentBottom="true"

另外,下划线和选项卡之间的线去除的方法时在TabWidget标签中设置属性android:tabStripEnabled="false"

main.xml

<?xml version="1.0" encoding="utf-8"?>
<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"android:orientation="vertical" ><FrameLayout android:id="@android:id/tabcontent"android:layout_width="fill_parent"android:layout_height="fill_parent"android:padding="5dp"></FrameLayout><RelativeLayoutandroid:layout_width="fill_parent"android:layout_height="fill_parent"><!-- tabStripEnabled属性去掉底部下划线与选项卡间的下划线 --><!-- layout_alignParentBottom属性即可将其放在底部菜单栏,注意,必须在RelativeLayout里 --><TabWidget android:id="@android:id/tabs"android:tabStripEnabled="false"android:background="#6E6E6E"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"></TabWidget></RelativeLayout></TabHost>

主要代码

package com.loulijun.demo1;import android.app.TabActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TabHost;public class Demo1Activity extends TabActivity {/** Called when the activity is first created. */private TabHost tabhost;private Intent intent1, intent2, intent3, intent4;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);tabhost = getTabHost();intent1 = new Intent(Demo1Activity.this, One.class);tabhost.addTab(tabhost.newTabSpec("one").setIndicator("电话",getResources().getDrawable(android.R.drawable.ic_menu_call)).setContent(intent1));intent2 = new Intent(Demo1Activity.this, Two.class);tabhost.addTab(tabhost.newTabSpec("two").setIndicator("相机",getResources().getDrawable(android.R.drawable.ic_menu_camera)).setContent(intent2));intent3 = new Intent(Demo1Activity.this, Three.class);tabhost.addTab(tabhost.newTabSpec("three").setIndicator("分享",getResources().getDrawable(android.R.drawable.ic_menu_share)).setContent(intent3));intent4 = new Intent(Demo1Activity.this, Four.class);tabhost.addTab(tabhost.newTabSpec("four").setIndicator("更多",getResources().getDrawable(android.R.drawable.ic_menu_more)).setContent(intent4));}
}

运行效果如下:

实现方式二:隐藏TabWidget,通过RadioGroup和RadioButton实现底部菜单栏

这种方式更漂亮,网上基本用的是这种方式,通过setCurrentTabByTag来切换不同的选项卡

main.xml

<?xml version="1.0" encoding="utf-8"?>
<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"><LinearLayoutandroid: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="0.0dip"android:layout_weight="1.0"/><TabWidget android:id="@android:id/tabs"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="0.0"android:visibility="gone"/><RadioGroupandroid:id="@+id/main_tab"android:background="@drawable/maintab_toolbar_bg"android:orientation="horizontal"android:layout_width="fill_parent"android:layout_height="wrap_content"android:gravity="center_vertical"android:layout_gravity="bottom"><RadioButton android:layout_marginTop="2.0dip"android:text="@string/main_home"android:drawableTop="@drawable/icon_1_n"android:id="@+id/radio_button0"style="@style/main_tab_bottom"/><RadioButton android:layout_marginTop="2.0dip"android:text="@string/main_news"android:drawableTop="@drawable/icon_2_n"android:id="@+id/radio_button1"style="@style/main_tab_bottom"/><RadioButton android:layout_marginTop="2.0dip"android:text="@string/main_my_info"android:drawableTop="@drawable/icon_3_n"android:id="@+id/radio_button2"style="@style/main_tab_bottom"/><RadioButton android:layout_marginTop="2.0dip"android:text="@string/menu_search"android:drawableTop="@drawable/icon_4_n"android:id="@+id/radio_button3"style="@style/main_tab_bottom"/><RadioButton android:layout_marginTop="2.0dip"android:text="@string/more"android:drawableTop="@drawable/icon_5_n"android:id="@+id/radio_button4"style="@style/main_tab_bottom"/></RadioGroup></LinearLayout>
</TabHost>

drawable/home_btn_bg.xml:切换时的效果

<?xml version="1.0" encoding="UTF-8"?>
<selectorxmlns:android="http://schemas.android.com/apk/res/android"><item android:state_focused="true" android:state_enabled="true" android:state_pressed="false" android:drawable="@drawable/home_btn_bg_s" /><item android:state_enabled="true" android:state_pressed="true" android:drawable="@drawable/home_btn_bg_s" /><item android:state_enabled="true" android:state_checked="true" android:drawable="@drawable/home_btn_bg_d" /><item android:drawable="@drawable/transparent" />
</selector>

string/dimens.xml 尺寸文件

<?xml version="1.0" encoding="utf-8"?>
<resources><dimen name="bottom_tab_padding_drawable">2.0dip</dimen><dimen name="bottom_tab_padding_up">5.0dip</dimen><dimen name="bottom_tab_font_size">10.0dip</dimen>
</resources>

string/drawables.xml 设置为透明

<?xml version="1.0" encoding="utf-8"?>
<resources>
<item type="drawable" name="transparent">#00000000</item>
</resources>

string/styles.xml 样式文件

<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="main_tab_bottom"><item name="android:textSize">@dimen/bottom_tab_font_size</item><item name="android:textColor">#ffffffff</item><item name="android:ellipsize">marquee</item><item name="android:gravity">center_horizontal</item><item name="android:background">@drawable/home_btn_bg</item><item name="android:paddingTop">@dimen/bottom_tab_padding_up</item><item name="android:layout_width">fill_parent</item><item name="android:layout_height">wrap_content</item><item name="android:button">@null</item><item name="android:singleLine">true</item><item name="android:drawablePadding">@dimen/bottom_tab_padding_drawable</item><item name="android:layout_weight">1.0</item>
</style>
</resources>

主要的代码

package com.loulijun.demo2;import android.app.TabActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Window;
import android.widget.RadioGroup;
import android.widget.TabHost;
import android.widget.RadioGroup.OnCheckedChangeListener;
public class MainTabActivity extends TabActivity implements OnCheckedChangeListener{private RadioGroup mainTab;private TabHost tabhost;private Intent iHome;private Intent iNews;private Intent iInfo;private Intent iSearch;private Intent iMore;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.main);mainTab=(RadioGroup)findViewById(R.id.main_tab);mainTab.setOnCheckedChangeListener(this);tabhost = getTabHost();iHome = new Intent(this, HomeActivity.class);tabhost.addTab(tabhost.newTabSpec("iHome").setIndicator(getResources().getString(R.string.main_home), getResources().getDrawable(R.drawable.icon_1_n)).setContent(iHome));iNews = new Intent(this, NewsActivity.class);tabhost.addTab(tabhost.newTabSpec("iNews").setIndicator(getResources().getString(R.string.main_news), getResources().getDrawable(R.drawable.icon_2_n)).setContent(iNews));iInfo = new Intent(this, MyInfoActivity.class);tabhost.addTab(tabhost.newTabSpec("iInfo").setIndicator(getResources().getString(R.string.main_my_info), getResources().getDrawable(R.drawable.icon_3_n)).setContent(iInfo));iSearch = new Intent(this,SearchActivity.class);tabhost.addTab(tabhost.newTabSpec("iSearch").setIndicator(getResources().getString(R.string.menu_search), getResources().getDrawable(R.drawable.icon_4_n)).setContent(iSearch));iMore = new Intent(this, MoreActivity.class);tabhost.addTab(tabhost.newTabSpec("iMore").setIndicator(getResources().getString(R.string.more), getResources().getDrawable(R.drawable.icon_5_n)).setContent(iMore));}@Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) {switch(checkedId){case R.id.radio_button0:this.tabhost.setCurrentTabByTag("iHome");break;case R.id.radio_button1:this.tabhost.setCurrentTabByTag("iNews");break;case R.id.radio_button2:this.tabhost.setCurrentTabByTag("iInfo");break;case R.id.radio_button3:this.tabhost.setCurrentTabByTag("iSearch");break;case R.id.radio_button4:this.tabhost.setCurrentTabByTag("iMore");break;}}}

效果图

下载地址:

http://files.cnblogs.com/loulijun/SinaWeibo.zip

下面是几个参考:

农民伯伯:

http://www.cnblogs.com/over140/archive/2011/03/02/1968042.html

http://www.cnblogs.com/over140/archive/2010/08/30/1812290.html

kjsolo

http://www.cnblogs.com/soloho/archive/2012/03/17/2403232.html

Android底部菜单栏(图片+文字)相关推荐

  1. android底部菜单栏demo

    上一个项目已经做完了,这周基本上没事,所以整理了下以前的项目,想把一些通用的部分封装起来,这样以后遇到相似的项目就不用重复发明轮子了,也节省了开发效率.今天把demo贴出来一是方便以后自己查询,二是希 ...

  2. Android底部菜单栏 仿微博效果

    实现方式一:通过TabWidget实现 这种方式主要是在布局中将TabWidget标签嵌套在RelativeLayout中,并且在TabWidget标签中中设置 android:layout_alig ...

  3. android radiogroup 底部菜单,Android底部菜单栏(RadioGroup+Fragment)美化

    众所周知,android的底部菜单栏太重要,平时项目一般都是需要用到的,但是网上关于这方面的demo做得太丑了,实在惨不忍睹,所以这里便用RadioGroup+Fragment的方式写了一个,顺便美化 ...

  4. 【Android UI】图片 + 文字展示by SpannableStringBuilder

    起源 图片和文字混合展示,比如这么个需求,需要在每段文字的左边要有一个小圆点,(小圆点符号在android系统中并不支持). 先用TextView的setDrawableLeft, 嗯,达到要求,那么 ...

  5. Android 原生分享图片文字到微信

    分享纯文字 Activity代码使用 shareWechatFriend(MainActivity.this, "这里是分享的内容"); 方法shareWechatFriend(C ...

  6. android图片放大失真,Android中解决图片文字放大失真的问题

    1 背景自适应且不失真问题的存在背景自适应且不失真问题的存在 制作自适应背景图片是 UI 开发的一个广泛问题 也是界面设计师渴望解决的问题 我 相信我们彼此都深有体会 比如 列表的背景图一定 但是列表 ...

  7. Android底部菜单栏、Android沉浸式状态栏(顶部状态栏修改颜色)、自定义标题栏

    0.简介: 没有使用TabHost切换,而是变成FragmentActivity替换Fragment:沉浸式引用的git上面的jar包. 先看图片 1.底部导航栏 核心代码 <span styl ...

  8. android 自定义菜单栏,GitHub - earthWo/AndroidBottomNavigation: android 底部菜单栏,自定义样式,自定义菜单数量,添加滚动动画和水波纹动画...

    AndroidBottomNavigation 截图 使用方法 gradle: compile 'com.whitelife.library:library:1.0.1' maven: com.whi ...

  9. 公众号推文、底部菜单栏怎样实现调用手机拨打电话号码?

    如何实现点击一个按键就能跳转到拨打电话界面呢?我最近发现了一个小程序–微电话,感觉使用起来十分方便,对比一下之前看到一些电话还要记下电话号码,然后打开拨号界面,拨号,这种流程来说简直方便多了!下面我们 ...

最新文章

  1. CentOS 8 已是绝版?还有后续么?
  2. Android多媒体开发:录音机
  3. 猴子偷桃php代码,C++实现猴子吃桃的示例代码
  4. 数据结构与算法 - 稀疏数组(理解+代码实现案例)
  5. 安农大计算机调剂,2020年安徽农业大学硕士研究生调剂公告
  6. SqlSever分页查询,仅扫描一次表
  7. Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈
  8. PHPCMS商城:模块_购物车+订单模块(资源合集)
  9. AngularJs HelloWorld
  10. matlab数字信号处理与应用 张德丰,MATLAB数字信号处理与应用
  11. 计算机论文有哪些方向,计算机论文研究方向有以下四类
  12. NLP之文本分类方法之基础知识
  13. ios 图片合成幻灯片_为iPad构建iOS幻灯片应用程序
  14. Favicon.ico图片在线制作网站PHP源码+支持多种图片格式转换
  15. Illegal mix of collations
  16. Android打开第三方地图使用方法
  17. 【Qt炫酷动画】demo02-仿苹果对话框淡入淡出的动画
  18. 学习C++该看什么书?
  19. 思科—三层交换机实现不同vlan的PC互通
  20. I am a MCAD.

热门文章

  1. linux内核计算次方,linux内核bic和cubic实现
  2. js eval Uncaught SyntaxError: unexpected token: ‘:‘
  3. linux-架构-网络波动
  4. Android Studio怎么把查看代码的左箭头、右箭头图标加到右边的快捷工具栏
  5. Java实现增删改查系统代码(全~纯干货)
  6. 区块链技术指南学习(五)双花
  7. 网易云音乐python爬虫搜索接口,评论接口,歌词接口
  8. S700K道岔故障诊断数据txt及故障诊断算法
  9. 土豆网王微:做自己生活的导演
  10. 怎么看计算机的网络ping值,Win7怎么查看ping值 win7测试ping值的方法