Android实现自定义菜单

来源:互联网 发布:mac删除迅雷 编辑:程序博客网 时间:2024/05/01 07:37

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

   首先创建自定义菜单

     对话框经常作为Activity的一部分来创建和显示。你通常应该从protected Dialog Activity.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);

 

 

原创粉丝点击