步步为营_Android开发课[20]_用户界面之Menu(菜单)

这篇博客详细介绍了Android中Menu的使用,包括item元素的属性、系统默认样式、如何在代码中定义布局以及自定义PopupWindow和GridView样式的Menu。通过实例展示了Menu的各种实现方式,帮助开发者深入理解并应用Menu到用户界面设计。

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

Focus on technology, enjoy life!—— QQ:804212028
浏览链接:http://blog.youkuaiyun.com/y18334702058/article/details/44624305


  • 主题:用户界面之Menu(菜单)
    -

item元素的属性说明如下:

— id:唯一标示菜单的ID引用。

— menuCategory:菜单分类。

— orderInCategory:分类排序。

— title:菜单标题字符串。

— titleCondensed:浓缩标题,适合标题太长的时候使用。

— icon:菜单的图标。

— alphabeticShortcut:字符快捷键。

— numericShortcut:数字快捷键。

— checkable:是否可选。

— checked:是否已经被选。

— visible:是否可见。

— enabled:是否可用。

Menu默认样式(实例1)
系统自带默认样式是在屏幕底部弹出一个菜单,这个菜单我们就叫他选项菜单OptionsMenu
res/menu下的menu_main.xml文件

<menu xmlns:android="http://schemas.android.com/apk/res/android" >  

    <item  
        android:id="@+id/menu_settings"  
        android:orderInCategory="1"   
        android:title="设置"/>  
    <item  
        android:id="@+id/menu_about" 
        android:orderInCategory="2"  
        android:title="关于"/>  
    <item  
        android:id="@+id/menu_exit"  
        android:orderInCategory="3"  
        android:title="退出"/>        
</menu>  

MainActivity.java代码如下:

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;


public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    public boolean onCreateOptionsMenu(Menu menu){
        getMenuInflater().inflate(R.menu.memu_main, menu);
        return true;
    }

    public boolean onOptionsItemSelected(MenuItem item){
        switch(item.getItemId()){
         case R.id.action_about:             
             Toast.makeText(MainActivity.this, ""+"关于", Toast.LENGTH_SHORT).show();  
             break;  

         case R.id.action_settings:                
             Toast.makeText(MainActivity.this, ""+"设置", Toast.LENGTH_SHORT).show();  
             break;  

         case R.id.action_exit:                
             Toast.makeText(MainActivity.this, ""+"退出", Toast.LENGTH_SHORT).show();  
             break;  

         default:  
             break;  
        }
        return super.onOptionsItemSelected(item);

    }
}

运行结果:

这里写图片描述

Menu默认样式(实例2)
直接在代码中定义布局

package com.wjq.menu;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

public class DefaultMenu extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        /*
         * 
         * add()方法的四个参数,依次是:
         * 
         * 1、组别,如果不分组的话就写Menu.NONE,
         * 
         * 2、Id,这个很重要,Android根据这个Id来确定不同的菜单
         * 
         * 3、顺序,那个菜单现在在前面由这个参数的大小决定
         * 
         * 4、文本,菜单的显示文本
         */

        menu.add(Menu.NONE, Menu.FIRST + 1, 5, "删除").setIcon(

        android.R.drawable.ic_menu_delete);

        // setIcon()方法为菜单设置图标,这里使用的是系统自带的图标,同学们留意一下,以

        // android.R开头的资源是系统提供的,我们自己提供的资源是以R开头的

        menu.add(Menu.NONE, Menu.FIRST + 2, 2, "保存").setIcon(

        android.R.drawable.ic_menu_edit);

        menu.add(Menu.NONE, Menu.FIRST + 3, 6, "帮助").setIcon(

        android.R.drawable.ic_menu_help);

        menu.add(Menu.NONE, Menu.FIRST + 4, 1, "添加").setIcon(

        android.R.drawable.ic_menu_add);

        menu.add(Menu.NONE, Menu.FIRST + 5, 4, "详细").setIcon(

        android.R.drawable.ic_menu_info_details);

        menu.add(Menu.NONE, Menu.FIRST + 6, 3, "发送").setIcon(

        android.R.drawable.ic_menu_send);

        return true;

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {

        case Menu.FIRST + 1:

            Toast.makeText(this, "删除菜单被点击了", Toast.LENGTH_LONG).show();

            break;

        case Menu.FIRST + 2:

            Toast.makeText(this, "保存菜单被点击了", Toast.LENGTH_LONG).show();

            break;

        case Menu.FIRST + 3:

            Toast.makeText(this, "帮助菜单被点击了", Toast.LENGTH_LONG).show();

            break;

        case Menu.FIRST + 4:

            Toast.makeText(this, "添加菜单被点击了", Toast.LENGTH_LONG).show();

            break;

        case Menu.FIRST + 5:

            Toast.makeText(this, "详细菜单被点击了", Toast.LENGTH_LONG).show();

            break;

        case Menu.FIRST + 6:

            Toast.makeText(this, "发送菜单被点击了", Toast.LENGTH_LONG).show();

            break;

        }

        return false;

    }

    @Override
    public void onOptionsMenuClosed(Menu menu) {
        Toast.makeText(this, "选项菜单关闭了", Toast.LENGTH_LONG).show();
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        Toast.makeText(this,
                "选项菜单显示之前onPrepareOptionsMenu方法会被调用,你可以用此方法来根据打当时的情况调整菜单",
                Toast.LENGTH_LONG).show();

        // 如果返回false,此方法就把用户点击menu的动作给消费了,onCreateOptionsMenu方法将不会被调用

        return true;

    }
}

运行结果:

这里写图片描述

Menu自定义PopupWindow样式(实例)
自定义一个Menu布局,mymenu.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/zong"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#C1CDC1"
    android:baselineAligned="false"
    android:gravity="center_horizontal"
    android:orientation="horizontal" >

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#A1A1A1"
        android:gravity="center_horizontal"
        android:layout_marginTop="1dp"
        android:orientation="horizontal" >

     <LinearLayout
          android:id="@+id/menu_0"
          android:clickable="true"
          android:layout_width="106dp" android:layout_height="wrap_content"
          android:orientation="vertical" android:gravity="center_horizontal"
          android:layout_marginRight="1dp"
          android:layout_marginLeft="1dip"
          android:layout_marginTop="1dp"      
          android:layout_gravity="fill_horizontal"
          android:background="#00868B"
          >
          <ImageView
            android:id="@+id/menu_item_iv_helper"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/myimage1"
            />
         <TextView
             android:id="@+id/menu_item_txt_helper"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#ff222222"
            android:text="关于"
            />

       </LinearLayout>

      <LinearLayout
          android:id="@+id/menu_1"
          android:layout_width="106dp" android:layout_height="wrap_content"
          android:orientation="vertical" android:gravity="center_horizontal"
          android:layout_marginRight="1dp"
          android:layout_marginTop="1dp"
          android:layout_gravity="fill_horizontal"
           android:background="#00868B"
          >
          <ImageView
            android:id="@+id/menu_item_iv_feedback"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/myimage2"
            />
         <TextView
             android:id="@+id/menu_item_txt_feedback"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#ff222222"
            android:text="设置"
            />
       </LinearLayout>
        <LinearLayout
          android:id="@+id/menu_2" 
          android:layout_width="106dp" android:layout_height="wrap_content"
          android:orientation="vertical" android:gravity="center_horizontal"
          android:layout_marginTop="1dp"
          android:layout_marginRight="1dp"
          android:layout_gravity="fill_horizontal"
          android:background="#00868B"
          >
          <ImageView
            android:id="@+id/menu_item_iv_exit"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/myimage3"

            />
         <TextView
             android:id="@+id/menu_item_txt_exit"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#ff222222"
            android:text="退出"
            />
       </LinearLayout>
    </LinearLayout>
</LinearLayout>

定义一个MyMenu类,MyMenu.java源代码:

import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.PopupWindow;

public class MyMenu {

    private PopupWindow pop;
    private Activity activity;
    private View[] menu = null;

    public MyMenu(Activity activity){
        this.activity = activity;
    }

    public PopupWindow getMenu(OnTouchListener touchListener,OnKeyListener keyListener){
        View sub_view = activity.getLayoutInflater().inflate(R.layout.mymenu, null);
         pop = new PopupWindow(sub_view,ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);          
            pop.setAnimationStyle(R.style.PopupAnimation);
            //pop.setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.pop_menu_bg));
            pop.setFocusable(true);
            pop.setTouchable(true);
            pop.setOutsideTouchable(true);
            sub_view.setFocusableInTouchMode(true); 
            pop.setTouchInterceptor(touchListener);
            sub_view.setOnKeyListener(keyListener);


        return pop;


    }   
}

MainActivity.java源代码:

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnKeyListener;
import android.view.View.OnTouchListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.PopupWindow;


public class MainActivity extends Activity {

   private PopupWindow pop;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MyMenu myMenu = new MyMenu(this);
        pop = myMenu.getMenu(touchListener, keyListener);


    }


    public boolean onKeyDown(int keyCode, KeyEvent event){
        if(keyCode == KeyEvent.KEYCODE_MENU){
            if(pop.isShowing()){
                pop.dismiss();
            }
            else{
                pop.showAtLocation(findViewById(R.id.main), Gravity.BOTTOM, 0, 0);
        }
        }
        return super.onKeyDown(keyCode, event);
    }

    /**
     * 处理外部点击事件,外部被点击,Menu就退出
     */

        private OnTouchListener touchListener = new OnTouchListener() {

            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
                    pop.dismiss();
                }
                return false;
            }
        };
        private OnKeyListener keyListener = new OnKeyListener() {

            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (event.getAction() == KeyEvent.ACTION_DOWN
                        && keyCode == KeyEvent.KEYCODE_MENU) {
                    pop.dismiss();
                    return true;
                }
                return false;
            }
        };

}

运行结果:

这里写图片描述

Menu自定义GridView样式(实例)

先定义一个菜单的自定义布局gridview_menu。
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>

CustomizeMenu.java:

import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnKeyListener;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.SimpleAdapter;
import android.widget.AdapterView.OnItemClickListener;

public class CustomizeMenu extends Activity {

    private boolean isMore = false;// menu菜单翻页控制
    AlertDialog menuDialog;// menu菜单Dialog
    GridView menuGrid;
    View menuView;

    private final int ITEM_SEARCH = 0;// 搜索
    private final int ITEM_FILE_MANAGER = 1;// 文件管理
    private final int ITEM_DOWN_MANAGER = 2;// 下载管理
    private final int ITEM_FULLSCREEN = 3;// 全屏
    private final int ITEM_MORE = 11;// 菜单


    /** 菜单图片 **/
    int[] menu_image_array = { R.drawable.menu_search,
            R.drawable.menu_filemanager, R.drawable.menu_downmanager,
            R.drawable.menu_fullscreen, R.drawable.menu_inputurl,
            R.drawable.menu_bookmark, R.drawable.menu_bookmark_sync_import,
            R.drawable.menu_sharepage, R.drawable.menu_quit,
            R.drawable.menu_nightmode, R.drawable.menu_refresh,
            R.drawable.menu_more };
    /** 菜单文字 **/
    String[] menu_name_array = { "搜索", "文件管理", "下载管理", "全屏", "网址", "书签",
            "加入书签", "分享页面", "退出", "夜间模式", "刷新", "更多" };
    /** 菜单图片2 **/
    int[] menu_image_array2 = { R.drawable.menu_auto_landscape,
            R.drawable.menu_penselectmodel, R.drawable.menu_page_attr,
            R.drawable.menu_novel_mode, R.drawable.menu_page_updown,
            R.drawable.menu_checkupdate, R.drawable.menu_checknet,
            R.drawable.menu_refreshtimer, R.drawable.menu_syssettings,
            R.drawable.menu_help, R.drawable.menu_about, R.drawable.menu_return };
    /** 菜单文字2 **/
    String[] menu_name_array2 = { "自动横屏", "笔选模式", "阅读模式", "浏览模式", "快捷翻页",
            "检查更新", "检查网络", "定时刷新", "设置", "帮助", "关于", "返回" };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        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;
                }


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

    private SimpleAdapter getMenuAdapter(String[] menuNameArray, int[] imageResourceArray) {

        ArrayList<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();
        for (int i = 0; i < menuNameArray.length; i++) {
            HashMap<String, Object> map = new HashMap<String, Object>();
            map.put("itemImage", imageResourceArray[i]);
            map.put("itemText", menuNameArray[i]);
            data.add(map);
        }
        SimpleAdapter simperAdapter = new SimpleAdapter(this, data,
                R.layout.item_menu, new String[] { "itemImage", "itemText" },
                new int[] { R.id.item_image, R.id.item_text });
        return simperAdapter;
    }
    @Override
    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
    }

}

运行结果:

这里写图片描述

Focus on technology, enjoy life!—— QQ:804212028
浏览链接:http://blog.youkuaiyun.com/y18334702058/article/details/44624305

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值