首先,我们来看看这张图吧

看下面的menu菜单,是原装的菜单,好丑陋哦,类似于小编这么爱美的人来说,纯粹就是天大的打击,接受不起。于是,小编就发奋图强,努力,努力,再努力,终于,将菜单改的漂亮了一点,不信你看看。

看到了吧,面对这么漂亮的menu菜单你怎么会不心动呢?心动不如行动,仔细看看下面我是怎么实现的吧:

新建一布局文件menu_main.xml,源代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
	android:id="@+id/widget32"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent"
	android:orientation="vertical"
	xmlns:android="http://schemas.android.com/apk/res/android">
	<LinearLayout
		android:id="@+id/widget33"
		android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		android:padding="5dp"
		android:background="@drawable/menu_bg"
		android:layout_gravity="center_horizontal">
		<LinearLayout
			android:id="@+id/menu_update_btn"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:orientation="vertical"
			android:gravity="center"
			android:layout_weight="1"
			android:background="@drawable/menu_btn_bg"
			android:layout_gravity="center_horizontal">
			<ImageView
	    	    android:layout_width="wrap_content"
	    		android:layout_height="wrap_content"
	    		android:src="@drawable/btn_update" />
    		<TextView
	    	    android:layout_width="wrap_content"
	    		android:layout_height="wrap_content"
	    		android:text="更新系统"
	    		android:textColor="#eee"/>
		</LinearLayout>
		<LinearLayout
			android:id="@+id/menu_aboutus_btn"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:orientation="vertical"
			android:gravity="center"
			android:layout_weight="1"
			android:background="@drawable/menu_btn_bg"
			android:layout_gravity="center_horizontal">
			<ImageView
	    	    android:layout_width="wrap_content"
	    		android:layout_height="wrap_content"
	    		android:src="@drawable/btn_aboutus" />
    		<TextView
	    	    android:layout_width="wrap_content"
	    		android:layout_height="wrap_content"
	    		android:text="关于我们"
	    		android:textColor="#eee"/>
		</LinearLayout>
		<LinearLayout
			android:id="@+id/menu_systeminf_btn"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:orientation="vertical"
			android:gravity="center"
			android:layout_weight="1"
			android:background="@drawable/menu_btn_bg"
			android:layout_gravity="center_horizontal">
			<ImageView
	    	    android:layout_width="wrap_content"
	    		android:layout_height="wrap_content"
	    		android:src="@drawable/btn_systeminf" />
    		<TextView
	    	    android:layout_width="wrap_content"
	    		android:layout_height="wrap_content"
	    		android:text="系统信息"
	    		android:textColor="#eee"/>
		</LinearLayout>
		<LinearLayout
			android:id="@+id/menu_close_btn"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:orientation="vertical"
			android:gravity="center"
			android:layout_weight="1"
			android:background="@drawable/menu_btn_bg"
			android:layout_gravity="center_horizontal">
			<ImageView
	    	    android:layout_width="wrap_content"
	    		android:layout_height="wrap_content"
	    		android:src="@drawable/btn_close" />
    		<TextView
	    	    android:layout_width="wrap_content"
	    		android:layout_height="wrap_content"
	    		android:text="退出系统"
	    		android:textColor="#eee"/>
		</LinearLayout>
	</LinearLayout>
</LinearLayout>

布局完成之后,在想要出现menu的Activity添加onKeyDown事件,代码为:

public boolean onKeyDown(int keyCode, KeyEvent event)
    {
    	if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0)
    	{  //获取 back键
        	if(menu_display)
        	{
        		//如果 Menu已经打开 ,先关闭Menu
        		menuWindow.dismiss();
        		menu_display = false;
        	}
        	else
        	{
        		Intent intent = new Intent();
            	intent.setClass(MainActivity.this,ExitActivity.class);
            	startActivity(intent);
        	}
    	}

    	else if(keyCode == KeyEvent.KEYCODE_MENU)
    	{   //获取 Menu键
			if(!menu_display)
			{
				//获取LayoutInflater实例
				inflater = (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
				//这里的main布局是在inflate中加入的哦,以前都是直接this.setContentView()的吧?呵呵
				//该方法返回的是一个View的对象,是布局中的根
				layout = inflater.inflate(R.layout.menu_main, null);

				//下面我们要考虑了,我怎样将我的layout加入到PopupWindow中呢???很简单
				menuWindow = new PopupWindow(layout,LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); //后两个参数是width和height
				//menuWindow.showAsDropDown(layout); //设置弹出效果
				//menuWindow.showAsDropDown(null, 0, layout.getHeight());
				menuWindow.showAtLocation(this.findViewById(R.id.mainmymusic), Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0, 0); //设置layout在PopupWindow中显示的位置
				//如何获取我们main中的控件呢?也很简单
				mUpdateBtn=(LinearLayout)layout.findViewById(R.id.menu_update_btn);
				mAboutusBtn=(LinearLayout)layout.findViewById(R.id.menu_aboutus_btn);
				mSysteminfBtn=(LinearLayout)layout.findViewById(R.id.menu_systeminf_btn);
				mCloseBtn = (LinearLayout)layout.findViewById(R.id.menu_close_btn);

				//下面对每一个Layout进行单击事件的注册吧。。。
				//比如单击某个MenuItem的时候,他的背景色改变
				//事先准备好一些背景图片或者颜色
				mUpdateBtn.setOnClickListener (new View.OnClickListener() {
					public void onClick(View arg0) {
						Toast.makeText(MainActivity.this, "没有更新的系统版本", Toast.LENGTH_LONG).show();
			        	menuWindow.dismiss(); //响应点击事件之后关闭Menu
					}
				});

				mAboutusBtn.setOnClickListener (new View.OnClickListener() {
					public void onClick(View arg0) {
						Toast.makeText(MainActivity.this, "我们是一个民间组织哦~~", Toast.LENGTH_LONG).show();
			        	menuWindow.dismiss(); //响应点击事件之后关闭Menu
					}
				});

				mSysteminfBtn.setOnClickListener (new View.OnClickListener() {
					public void onClick(View arg0) {
						Toast.makeText(MainActivity.this, "我的随身听音乐", Toast.LENGTH_LONG).show();
			        	menuWindow.dismiss(); //响应点击事件之后关闭Menu
					}
				});

				mCloseBtn.setOnClickListener (new View.OnClickListener() {
					public void onClick(View arg0) {
						//Toast.makeText(Main.this, "退出", Toast.LENGTH_LONG).show();
						Intent intent = new Intent();
			        	intent.setClass(MainActivity.this,ExitActivity.class);
			        	startActivity(intent);
			        	menuWindow.dismiss(); //响应点击事件之后关闭Menu
					}
				});	

				menu_display = true;
			}
			else
			{
				//如果当前已经为显示状态,则隐藏起来
				menuWindow.dismiss();
				menu_display = false;
			}
			return false;
		}
    	return false;
    }

上面,还需要定义几个变量,需要定义的变量为:

private LinearLayout mCloseBtn,mSysteminfBtn,mAboutusBtn,mUpdateBtn;
private boolean menu_display = false;
private PopupWindow menuWindow;
private LayoutInflater inflater;
private View layout;

至此,漂亮的menu出来了,心动了吧?那就赶紧打开自己的工程试试吧……

打造属于自己的安卓menu的更多相关文章

  1. 安卓Menu键的问题

    近期开发中有须要Menu键,结果发现了一个非常尴尬的问题.我的測试机上有Menu键.可是測试平板上没有,队友的測试机上竟然也没有Menu键.这着实有些尴尬... 上网谷歌之后才发现问题所在: 仅仅有在 ...

  2. 安卓menu的介绍与使用

    菜单之前是用户点击系统的菜单键才展示出来的,后来这个键渐渐被移除,菜单变成了点击任意的view都可以展示.菜单非为3种: 1.Options menu and action bar  选项菜单和操作栏 ...

  3. 打造属于自己的安卓Metro界面

    前言: 各位小伙伴,又到了每周更新文章了时候了,本来是周日能发出来呢,这不是赶上清明节吗,女王大人发话了,清明节前两天半陪她玩,只留给我周一下午半天时间写博客,哪里有女王哪里就有压迫呀有木有!好了闲话 ...

  4. 我们来八一八阿里云OS的实质和历史

    有个姓许的朋友在微信公众号上这样评论: 但是楼主对yunos的了解程度有多少,建议去了解下再评价别人,免费给你普及下:http://www.ithome.com/html/digi/109484.ht ...

  5. 支持多种浏览器的纯css下拉菜单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. Google工程师打造Remix OS系统 桌面版安卓下载

    三位前Google工程师打造的Remix OS系统终于来到了PC桌面上,现已可以下载尝鲜. Remix OS for PC基于Android-x86项目,由安卓5.1 Lollipop深度定制而来,不 ...

  7. 初学安卓开发随笔之 Menu、toast 用法、活动的四种启动模式 以及 一个方便的Base活动类使用方法

    Toast toast 是安卓系统的一种非常棒的提醒方式 首先定义一个弹出Toast的触发点,比如可以是按钮之类 其中 Toast.LENGTH_SHORT是指显示时长 还有一个内置变量为Toast. ...

  8. Nginx集群之.Net打造WebApp(支持IOS和安卓)

    目录 1       大概思路... 1 2       Nginx集群之.Net打造WebApp(支持IOS和安卓) 1 3       安卓模拟器... 1 4       MUI框架... 3 ...

  9. 安卓开发学习之Menu

    安卓开发中菜单是一个很重要的组件,从安卓开发文档(http://wear.techbrood.com/guide/index.html)中可以看到,安卓UI设计中的Menu主要分为: A.Option ...

随机推荐

  1. hadoop 2.0安装及HA配置简述

    一.单机模式 a.配置本机到本机的免密登录 b.解压hadoop压缩包,修改hadoop.env.sh中的JAVA_HOME c.修改core-site.xml <configuration&g ...

  2. [转]Linux下RPM软件包的安装及卸载 yum操作

    在 Linux 操作系统下,几乎所有的软件均通过RPM 进行安装.卸载及管理等操作.RPM 的全称为Redhat Package Manager ,是由Redhat 公司提出的,用于管理Linux 下 ...

  3. 【Head First Servlets and JSP】笔记1

    1.把Java放到HTML中,JSP应运而生. 2.Servlet本身并没有main()方法,所以必须要有其他Java程序去调用它,这个Java程序就是Web容器(Container).Tomcat就 ...

  4. Apache 工作模式详解

    Apache 工作模式详解 Apache 2.X  支持插入式并行处理模块,称为多路处理模块(MPM).在编译apache时必须选择也只能选择一个MPM,对类UNIX系统,有几个不同的MPM可供选择, ...

  5. [BZOJ2730]矿场搭建

    Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一 ...

  6. HIVE 编写自定义函数UDF

    一 新建JAVA项目 并添加 hive-exec-2.1.0.jar 和hadoop-common-2.7.3.jar hive-exec-2.1.0.jar 在HIVE安装目录的lib目录下 had ...

  7. Spring中Value注解的使用

    Spring中Value注解的使用 分类: Spring2014-08-16 17:28 2985人阅读 评论(0) 收藏 举报 有的时候我们定义了Properties文件,并且使用Spring的Pr ...

  8. PAT1063. Set Similarity (25)

    来自http://blog.csdn.net/tiantangrenjian/article/details/16868399 set_intersection 交集  set_union 并集  s ...

  9. Springboot- Spring缓存抽象学习笔记

    Spring缓存作用准备: 1.准备数据(准备一个有数据的库和表/导入数据库文件,准备好表和表里面的数据) 2.创建javaBean封装数据 3.整合MyBatis操作数据库( 这里用MyBatis) ...

  10. BZOJ 4726 [POI2017]Sabota?:树形dp

    传送门 题意 某个公司有 $ n $ 个人,上下级关系构成了一个有根树.其中有个人是叛徒(这个人不知道是谁).对于一个人, 如果他下属(直接或者间接, 不包括他自己)中叛徒占的比例超过 $ x $ , ...