ym——Android从零开始(14)(选项菜单+上下文菜单+子菜单)(新)

本文介绍了Android中菜单的使用,包括OptionMenu的程序生成和XML配置,上下文菜单的注册与事件绑定,以及SubMenu的展示与操作。通过实例代码展示了如何创建和实现各种菜单功能。

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

转载请注明本文出自Cym的博客(http://blog.youkuaiyun.com/cym492224103),谢谢支持!


菜单(menu)

普通菜单  OptionMenu

图片8.png

效果图:

点击menu显示

图片1.png

以下代码可实现:

1Activity过代码编写实现(程序生成)

@Override
        public boolean onCreateOptionsMenu(Menu menu) {                        // 显示菜单
                menu.add(Menu.NONE,                                                                         // 菜单不分组
                                Menu.FIRST + 1,                                                                 // 菜单项ID
                                5,                                                                                                 // 菜单编号
                                "删除")                                                                                        // 显示标题
                                .setIcon(android.R.drawable.ic_menu_delete);        // 设置图标
// menu.add(组别ID, 自身ID, 顺序序列, 显示文字)
                menu.add(Menu.NONE, Menu.FIRST + 2, 2, "保存").setIcon(
                                android.R.drawable.ic_menu_save);                                // 设置菜单项
                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, 7, "发送").setIcon(
                                android.R.drawable.ic_menu_send);                                // 设置菜单项
                menu.add(Menu.NONE, Menu.FIRST + 7, 3, "编辑").setIcon(
                                android.R.drawable.ic_menu_edit);                                // 设置菜单项
                return true;                                                                                        // 菜单显示
        }
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {                // 选中某个菜单项
                switch (item.getItemId()) {                                                                // 判断菜单项ID
                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;
                case Menu.FIRST + 7:
                        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,
                                "在菜单显示(onCreateOptionsMenu()方法)之前会调用此操作,可以在此操作之中完成一些预处理操作。",Toast.LENGTH_LONG).show();
                return true;                                                                                // 调用onCreateOptionsMenu()
        }

2通过配置XMl 代码编写实现(配置菜单项)

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
        <item
                android:id="@+id/item01"
                android:title="添加"
                android:icon="@android:drawable/ic_menu_add" />
        <item
                android:id="@+id/item02"
                android:title="保存"
                android:icon="@android:drawable/ic_menu_save" />
        <item
                android:id="@+id/item03"
                android:title="编辑"
                android:icon="@android:drawable/ic_menu_edit" />
        <item
                android:id="@+id/item04"
                android:title="详细"
                android:icon="@android:drawable/ic_menu_info_details" />
        <item
                android:id="@+id/item05"
                android:title="删除"
                android:icon="@android:drawable/ic_menu_delete" />
        <item
                android:id="@+id/item06"
                android:title="发送"
                android:icon="@android:drawable/ic_menu_send" />
        <item
                android:id="@+id/item06"
                android:title="帮助"
                android:icon="@android:drawable/ic_menu_help" />
        <item
                android:id="@+id/item07"
                android:title="发送"
                android:icon="@android:drawable/ic_menu_send" />
</menu>

Activity

  public boolean onCreateOptionsMenu(Menu menu) {                        // 显示菜单
                super.getMenuInflater().inflate(R.menu.mymenu, menu);        // 填充菜单项
                return true;                                                                                        // 菜单显示、
        }

上下文菜单  ContextMenu 

其他操作一样

图片2.png

效果图


以下代码可实现视图以及(功能):

1Activity过代码编写实现(程序生成)

注意 要在Activity onCreate方法里面 super.registerForContextMenu(this.listView) ;        

要给ListView注册上下文菜单对数据长按才会显示上下文菜单        

@Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {                                                                                                                        // 显示菜单
                super.onCreateContextMenu(menu, v, menuInfo) ;
menu.setHeaderTitle("联系人操作");//添加头部标题
                menu.add(Menu.NONE, Menu.FIRST + 1, 1, "复制到电话拨号盘");
                menu.add(Menu.NONE, Menu.FIRST + 2, 2, "复制到短信拨号盘");
                menu.add(Menu.NONE, Menu.FIRST + 3, 3, "复制号码");
        }
        @Override
        public boolean onContextItemSelected(MenuItem item) {                        // 选中某个菜单项
                // 得到意图
                  Intent intent = new Intent();

                // 拿到菜单的信息         
AdapterContextMenuInfo acm = (AdapterContextMenuInfo) item.getMenuInfo();
// 得到当前点击的位置

                  int position = acm.position;
// 用当前选择的位置 从适配器里面拿到相对于的cursor
                   Cursor c = (Cursor)adapter.getItem(position);
// 从cursor里面拿到当前选择的号码
                   String number = c.getString(c.getColumnIndex("number"));
                switch (item.getItemId()) {
                case Menu.FIRST + 1:
//  复制到电话拨号盘
                        intent.setAction(Intent.ACTION_DIAL);
                        intent.setData(Uri.parse("tel:" + number));
                        startActivity(intent);
                        break;

                case Menu.FIRST + 2:
// 复制到短信拨号盘
                        intent.setAction(Intent.ACTION_SENDTO);
                        intent.setData(Uri.parse("smsto:" + number));
                        startActivity(intent);
                        break;
                case Menu.FIRST + 3:
// 复制号码通过一个服务要把值设置到粘贴板上面
ClipboardManager manager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
                        manager.setText(number);
                        break;
                default:
                        break;
                }
                return true;
        }
        @Override
        public void onContextMenuClosed(Menu menu) {                                        // 菜单退出时调用
                Toast.makeText(this, "上下文菜单关闭了", Toast.LENGTH_LONG).show();
        }

2通过配置XMl 代码编写实现(配置菜单项)

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
        <item
                android:id="@+id/item01"
                android:title="添加联系人"/>
        <item
                android:id="@+id/item02"
                android:title="查看详情"/>
        <item
                android:id="@+id/item03"
                android:title="删除信息"/>
        <item
                android:id="@+id/item04"
                android:title="另存为"/>
        <item
                android:id="@+id/item05"
                android:title="编辑"/>
</menu>

Activity

public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo
menuInfo) {                                                                                                                        // 显示菜单
                super.onCreateContextMenu(menu, v, menuInfo) ;
                menu.setHeaderTitle("信息操作") ;                                                        // 设置显示信息头
                super.getMenuInflater().inflate(R.menu.mymenu, menu);                // 填充菜单项
        }

其他方法不做修改


子菜单  SubMenu

图片4.png

效果图:

点击menu

显示
图片5.png

点击文件显示:

图片6.png

点击编辑显示:

图片7.png

通过一下代码可实现:

1Activity过代码编写实现(程序生成)

public boolean onCreateOptionsMenu(Menu menu) {                        // 显示菜单
                SubMenu fileMenu = menu.addSubMenu("文件");                                // 子菜单
                SubMenu editMenu = menu.addSubMenu("编辑");                                // 子菜单
                super.getMenuInflater().inflate(R.menu.mymenu, fileMenu) ;
                fileMenu.add(Menu.NONE, Menu.FIRST + 1, 1, "新建") ;        // 子菜单项
                fileMenu.add(Menu.NONE, Menu.FIRST + 2, 2, "打开") ;        // 子菜单项
                fileMenu.add(Menu.NONE, Menu.FIRST + 3, 3, "保存") ;        // 子菜单项
                editMenu.add(Menu.NONE, Menu.FIRST + 4, 4, "撤消");                // 子菜单项
                editMenu.add(Menu.NONE, Menu.FIRST + 5, 5, "恢复");                // 子菜单项
                return true ;
        }
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {                // 选中某个菜单项
                switch (item.getItemId()) {                                                                // 判断菜单项ID
                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;
                }
                return false;
        }

2通过配置XMl 代码编写实现(配置菜单项)

menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
                <item android:id="@+id/item01" android:title="新建">

                     <menu>
                        <item android:id="@+id/item05" android:title="新建1"/>
                        <item android:id="@+id/item06" android:title="新建2"/>                        
                    </menu>

                </item>
                <item android:id="@+id/item02" android:title="保存">
                    <menu>
                        <item android:id="@+id/item03" android:title="保存1"/>
                        <item android:id="@+id/item04" android:title="保存2"/>                        
                    </menu>


                </item>

</menu>

Activity:       

 public boolean onCreateOptionsMenu(Menu menu) {                        // 显示菜单

                super.getMenuInflater().inflate(R.menu.menu, fileMenu) ;  // 填充菜单项
                 return true ;
        } 

课后问题:

创建普通菜单的两种方式?

(程序生成)

(配置菜单项)


上下文菜单创建的步骤?1 2 3

注册super.registerForContextMenu(this.listView) ;        

创建onCreateContextMenu

绑定上下文菜单的选项事件onContextItemSelected


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值