使用菜单-3种方式

本文详细介绍了如何在Android应用中创建系统菜单、上下文菜单及子菜单,并阐述了菜单项的事件响应机制,包括如何通过代码实现菜单的创建、配置及事件监听。

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

参考资料
五篇关于创建菜单的例子,感觉不难
http://www.cnblogs.com/codingmyworld/tag/Android/

下面说明创建菜单(3种菜单)的方法

系统的选项菜单也叫主菜单,还有上下文菜单,和子菜单。

Android系统的系统菜单最多显示6个菜单项,否则就会折叠。

创建菜单方法原型:

public MenuItem add( int groupid, int itemid , int order, int titlrres| CharSequence title);

创建选项菜单,调用的方法是

//public boolean onCreateOptionsMenu(Menu menu);可以用这个来建立菜单和子菜单

菜单的事件响应函数为:
onMenuItemClick(MenuItem item)
{}
还可以有的方法为这两种!如果onMenuItemClick 返回true,则不会调用下面这两种方法!

// 单击每一个Activity菜单项时调用该方法
    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        Log.d("onOptionsItemSelected:itemid=", String.valueOf(item
                        .getItemId()));
        return true;
    }

    // 单击上下文菜单的某个菜单项时调用该方法
    @Override
    public boolean onContextItemSelected(MenuItem item)
    {
        Log.d("onContextItemSelected:itemid=", String.valueOf(item
                        .getItemId()));
        if (!"子菜单".equals(item.getTitle().toString()))
            showDialog("*" + item.getTitle().toString() + "*");
        return super.onContextItemSelected(item);
    }

当单机Menu按钮时,系统调用的方法,

// 单击Menu按钮时调用该方法来建立Activity菜单 , 创建菜单和子菜单...
    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        this.menu = menu;
        //创建菜单
        addMenu(menu);
        //创建子菜单
        addSubMenu(menu);

        // //////////////////错误,抛出 10-03 13:17:32.489: DEBUG/e(1667): Attempt to
        // add a sub-menu to a sub-menu.

        // SubMenu subMenu = fileSubMenu.addSubMenu(3, 1, 1, "子菜单");
        // subMenu.add(1, 1, 1, "菜单项1");
        // subMenu.add(1, 2, 2, "菜单项2");
        // ////////////////////

        return super.onCreateOptionsMenu(menu);
    }
package net.blogjava.mobile;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class Main extends Activity implements OnMenuItemClickListener,
        OnClickListener
{
    private Menu menu;
    private int menuItemId = Menu.FIRST;

    // 为按钮添加单击事件,注册上下文菜单
    private void init()
    {
        Button button = (Button) findViewById(R.id.btnAddMenu);
        button.setOnClickListener(this);
        EditText editText = (EditText) findViewById(R.id.edittext);
        TextView textView = (TextView) findViewById(R.id.textview);
        // 注册上下文菜单
        registerForContextMenu(button);
        registerForContextMenu(editText);
        registerForContextMenu(textView);

    }

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

    // 向Activity菜单添加10个菜单项,菜单项的id从10开始
    @Override
    public void onClick(View view)
    {
        if (menu == null)
            return;
        for (int i = 10; i < 20; i++)
        {
            int id = menuItemId++;
            menu.add(1, id, id, "菜单" + i);
        }
    }

    private void showDialog(String message)
    {
        new AlertDialog.Builder(this).setMessage("您单击了【" + message + "】菜单项.")
                .show();

    }

    // 单击Activity菜单、子菜单、上下文菜单的菜单项时调用该方法
    @Override
    public boolean onMenuItemClick(MenuItem item)
    {
    //菜单项单击事件的处理方法!如果要这样写,必须实现OnMenuIemClickListener接口
        Log.d("onMenuItemClick", "true");
        showDialog(item.getTitle().toString());
        return false;
    }

    // 向Activity菜单添加3个菜单项
    private void addMenu(Menu menu)
    {

        MenuItem addMenuItem = menu.add(1, menuItemId++, 1, "添加");
        addMenuItem.setIntent(new Intent(this, AddActivity.class));
        MenuItem deleteMenuItem = menu.add(1, menuItemId++, 2, "删除");
        deleteMenuItem.setIcon(R.drawable.delete);
        deleteMenuItem.setOnMenuItemClickListener(this);
        MenuItem menuItem1 = menu.add(1, menuItemId++, 3, "菜单1");
        menuItem1.setOnMenuItemClickListener(this);
        MenuItem menuItem2 = menu.add(1, menuItemId++, 4, "菜单2");

    }
    //添加子菜单
    private void addSubMenu(Menu menu)
    {
        // 添加子菜单
        SubMenu fileSubMenu = menu.addSubMenu(1, menuItemId++, 5, "文件");

        fileSubMenu.setIcon(R.drawable.file);
        fileSubMenu.setHeaderIcon(R.drawable.headerfile);
        // 子菜单不支持图像
        MenuItem newMenuItem = fileSubMenu.add(1, menuItemId++, 1, "新建");
        newMenuItem.setCheckable(true);
        newMenuItem.setChecked(true);
        MenuItem openMenuItem = fileSubMenu.add(2, menuItemId++, 2, "打开");
        MenuItem exitMenuItem = fileSubMenu.add(2, menuItemId++, 3, "退出");
        exitMenuItem.setChecked(true);
        fileSubMenu.setGroupCheckable(2, true, true);

    }

    // 单击Menu按钮时调用该方法来建立Activity菜单 , 创建菜单和子菜单...
    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        this.menu = menu;
        //创建菜单
        addMenu(menu);
        //创建子菜单
        addSubMenu(menu);

        // //////////////////错误,抛出 10-03 13:17:32.489: DEBUG/e(1667): Attempt to
        // add a sub-menu to a sub-menu.

        // SubMenu subMenu = fileSubMenu.addSubMenu(3, 1, 1, "子菜单");
        // subMenu.add(1, 1, 1, "菜单项1");
        // subMenu.add(1, 2, 2, "菜单项2");
        // ////////////////////

        return super.onCreateOptionsMenu(menu);
    }

    // 在Activity菜单显示前调用该方法,可以在这个方法中修改指定的菜单项
    @Override
    public boolean onPrepareOptionsMenu(Menu menu)
    {
        Log.d("onPrepareOptionsMenu", "true");
        return super.onPrepareOptionsMenu(menu);
    }

    // 当上下文菜单关闭时调用该方法
    @Override
    public void onContextMenuClosed(Menu menu)
    {
        Log.d("onContextMenuClosed", "true");
        super.onContextMenuClosed(menu);
    }

    // 当Activity菜单显示时调用该方法,这个方法在 onPrepareOptionsMenu之后被调用
    @Override
    public boolean onMenuOpened(int featureId, Menu menu)
    {
        Log.d("onMenuOpened", "true");
        return super.onMenuOpened(featureId, menu);
    }

    // 当Activity菜单被关闭时调用该方法
    @Override
    public void onOptionsMenuClosed(Menu menu)
    {
        Log.d("onOptionsMenuClosed", "true");
        super.onOptionsMenuClosed(menu);
    }

    @Override
    public boolean onMenuItemSelected(int featureId, MenuItem item)
    {
        super.onMenuItemSelected(featureId, item);
        Log.d("onMenuItemSelected:itemId=", String.valueOf(item.getItemId()));
        if ("菜单1".equals(item.getTitle()))
            showDialog("<" + item.getTitle().toString() + ">");
        else if ("菜单2".equals(item.getTitle()))
            showDialog("<" + item.getTitle().toString() + ">");
        return false;
    }

    // 单击每一个Activity菜单项时调用该方法
    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        Log
                .d("onOptionsItemSelected:itemid=", String.valueOf(item
                        .getItemId()));
        return true;
    }

    // 单击上下文菜单的某个菜单项时调用该方法
    @Override
    public boolean onContextItemSelected(MenuItem item)
    {
        Log
                .d("onContextItemSelected:itemid=", String.valueOf(item
                        .getItemId()));
        if (!"子菜单".equals(item.getTitle().toString()))
            showDialog("*" + item.getTitle().toString() + "*");
        return super.onContextItemSelected(item);
    }

    // 显示上下文菜单时调用该方法来添加自定义的上下文菜单项
    @Override
    public void onCreateContextMenu(ContextMenu menu, View view,
            ContextMenuInfo menuInfo)
    {
        super.onCreateContextMenu(menu, view, menuInfo);
        // menu.clear();
        menu.setHeaderTitle("上下文菜单");
        menu.setHeaderIcon(R.drawable.face);
        menu.add(0, menuItemId++, Menu.NONE, "菜单项1").setCheckable(true)
                .setChecked(true);
        menu.add(20, menuItemId++, Menu.NONE, "菜单项2");
        menu.add(20, menuItemId++, Menu.NONE, "菜单项3").setChecked(true);
        menu.setGroupCheckable(20, true, true);
        SubMenu sub = menu.addSubMenu(0, menuItemId++, Menu.NONE, "子菜单");
        sub.add("子菜单项1");
        sub.add("子菜单项2");

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值