自定义底部菜单栏(附源码)

本文介绍如何摆脱系统自带菜单栏的限制,通过自定义布局实现更美观、功能更丰富的菜单栏。包括使用PopupWindow创建菜单窗口及响应点击事件的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义底部菜单栏
系统自带的菜单栏缺陷:一个页面最多只能显示6个菜单项;不能设置menu的背景色和单击变成自己希望背景色;因为系统自带显示单一,所以那么就来自定义自己的菜单栏吧,让你的菜单栏更漂亮。


3、核心代码:学会了这些你就可以摆脱系统单一的菜单栏了,那么你就可以随心所欲的写自己绚丽的菜单了。
第一、自定义的menu其实没用到menu控件,完全是自定义的类似菜单那样的布局,menu.xml就免写了。
第二、关键是前台代码:
(1)自定义的菜单栏其实是当前按手机上的菜单键,弹出一个菜单窗口,当按手机上的退回键的时候,就让该窗口关闭,那怎么实现呢?

首先,在onKeyDown里面捕获menu,找到所要弹出的窗口布局,
public boolean onKeyDown(int keyCode, KeyEvent msg) {
if(keyCode==KeyEvent.KEYCODE_MENU)
{
/通过View.inflate加载xml
inflater = (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
layout = inflater.inflate(R.layout.main,null);
pop = new PopupWindow(layout,480,350);//获取PopupWindow对象并设置窗体的大小
pop.showAtLocation(layout, Gravity.CENTER,20,470); //设置窗体的位置
pop.showAsDropDown(layout); //弹出menu窗口

其次:那怎么弹出窗口已经找到了,那怎么找到弹出窗口上的控件呢?如下代码:
home=(LinearLayout)layout.findViewById(R.id.home);
找到了弹出窗口id名为home的LinearLayout,找到了控件,那我们就可以对这些控件写事件了,
可以对该LinearLayout设置背景,这里遇到一个问题,就是之前我们是可以用xml写代码直接控制
LinearLayout单击时的背景颜色,当单击过后是另外一种颜色,但是通过inflate加载的xml,在xml上
设置样式,根本就不起作用,这是自己总结出来的。
那我们该怎么写”LinearLayout单击时的背景颜色,当单击过后是另外一种颜色“呢?代码如下:
home.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
//单击时,可通过设置IsShow的boolean值,使得单击时是一种颜色,单击过后恢复单击前的颜色,不这么设置就会导致,当你单击了和单击后都会一直显示单击时的背景 色,不会有颜色变化。
if(IsShow==true)
{

home.setBackgroundResource(R.drawable.tab_two_highlight);//变色

//以下的背景色和和单击前颜色一样维持不变,是为了保持当单击一个LinearLayout的时候,其他的会变颜色,如果不这么写,会有一系列效果显示问题。
publish.setBackgroundResource(R.drawable.tab_one_normal);
change.setBackgroundResource(R.drawable.tab_one_normal);
more.setBackgroundResource(R.drawable.tab_one_normal);
IsShow=false;
}
//单击过后
else
{
home.setBackgroundResource(R.drawable.tab_one_normal);
publish.setBackgroundResource(R.drawable.tab_one_normal);
change.setBackgroundResource(R.drawable.tab_one_normal);
more.setBackgroundResource(R.drawable.tab_one_normal);
IsShow=true;
}
}
});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值