Android自带的Menu控件实现的菜单有一定的局限性,我们要实现UC浏览器Android版那样漂亮的菜单,不能直接用Menu控件来实现,而是要定制AlertDialog控件来实现。

首先创建自定义菜单

对话框经常作为Activity的一部分来创建和显示。你通常应该从protected DialogActivity.onCreateDialog (int id) 回调方法里创建对话框。当你使用这个回调函数时,Android系统会有效的设置这个Activity为每个对话框的所有者,从而自动管理每个对话框的状态并挂靠到Activity上。这样,每个对话框继承这个Activity的特定属性。比如,当一个对话框打开时,菜单键显示为这个Activity定义的选项菜单,音量键修改Activity使用的音频流。

        
  1. 注意:如果你决定在onCreateDialog()方法之外创建一个对话框,它将不会被附着到活动上。不过,你可以通过setOwnerActivity(Activity)把它附着到一个活动上。

当你想要显示一个对话框时,调用showDialog(int id) 方法并传递一个唯一标识这个对话框的整数。

当对话框第一次被请求时,Android从你的Activity中调用onCreateDialog(int id),你应该在这里初始化这个对话框Dialog。这个回调方法被传以和showDialog(int id)相同的ID。当你创建这个对话框后,在Activity的最后返回这个对象。

menuView = View.inflate(this, R.layout.gridview_menu, null);
// 创建AlertDialog
menuDialog = new AlertDialog.Builder(this).create();
menuDialog.setView(menuView);
menuDialog.setOnKeyListener(new OnKeyListener() {
public boolean onKey(DialogInterface dialog, int keyCode,
KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_MENU)// 监听按键
dialog.dismiss();
return false;
}
});

menuGrid = (GridView) menuView.findViewById(R.id.gridview);
menuGrid.setAdapter(getMenuAdapter(menu_name_array, menu_image_array));
/** 监听menu选项 **/
menuGrid.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
switch (arg2) {
case ITEM_SEARCH:// 搜索

break;
case ITEM_FILE_MANAGER:// 文件管理

break;
case ITEM_DOWN_MANAGER:// 下载管理

break;
case ITEM_FULLSCREEN:// 全屏

break;
case ITEM_MORE:// 翻页
if (isMore) {
menuGrid.setAdapter(getMenuAdapter(menu_name_array2,
menu_image_array2));
isMore = false;
} else {// 首页
menuGrid.setAdapter(getMenuAdapter(menu_name_array,
menu_image_array));
isMore = true;
}
menuGrid.invalidate();// 更新menu
menuGrid.setSelection(ITEM_MORE);
break;
}


}
});

定义菜单的XML(gridview_menu.xml)如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<GridView
android:id="@+id/gridview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:numColumns="4"
android:verticalSpacing="10dip"
android:horizontalSpacing="10dip"
android:stretchMode="columnWidth"
android:gravity="center"
/>

</LinearLayout>

按下Menu按键弹出定制AlertDialog控件可以用以下来实现。

@Override
/**
* 创建MENU
*/
public boolean onCreateOptionsMenu(Menu menu) {
menu.add("menu");// 必须创建一项
return super.onCreateOptionsMenu(menu);
}

@Override
/**
* 拦截MENU
*/
public boolean onMenuOpened(int featureId, Menu menu) {
if (menuDialog == null) {
menuDialog = new AlertDialog.Builder(this).setView(menuView).show();
} else {
menuDialog.show();
}
return false;// 返回为true 则显示系统menu
}

可以用以下的语句去改变自定义菜单的显示位置和透明度,达到自己想要的效果。

menuDialog = new AlertDialog.Builder(this).create();
WindowManager.LayoutParams lp = menuDialog.getWindow().getAttributes();
lp.alpha = 0.9f;//设置了对话框的透明度

lp.dimAmount = 0.5f;
lp.y = 35;//对话框的显示位置
menuDialog.getWindow().setAttributes(lp);

更多相关文章

  1. Eclipse New菜单中没有Android(安卓)Project选项
  2. android 对话框方式弹出实现
  3. [置顶] Android点击Button实现功能的几种方法
  4. ListView小知识整理:滑动背景、Item间隙等
  5. Android(安卓)Studio的基本控件 图片框与进度条
  6. android 一个很漂亮的控件ObservableScrollView(含片段代码和源码
  7. android:layout_margin真实含义 及 自定义复合控件 layout()执行
  8. ViewPager 使用方法详解
  9. Android(安卓)利用addView 动态给Activity添加View组件

随机推荐

  1. Android平台中进程与线程的基本知识
  2. Android面试经验一:
  3. Android手势源码浅析-----手势绘制(Gestu
  4. android orm映射框架 ormlite (类似于hib
  5. 【Android(安卓)Training - UserInfo】记
  6. android手机定位不准的问题
  7. Android休眠机制
  8. 关于启动Android模拟器时,运行时,会再弹出
  9. Android虚拟平台的编译和整合
  10. Android(安卓)以图找图功能