zoukankan      html  css  js  c++  java
  • 安卓开发笔记——Menu菜单组件(选项菜单,上下文菜单,子菜单)

    菜单是用户界面中最常见的元素之一,使用非常频繁,在Android中,菜单被分为如下三种,选项菜单(OptionsMenu)、上下文菜单(ContextMenu)和子菜单(SubMenu)。

    菜单的实现方式有2种:一种是通过布局文件xml生成菜单,另一种是通过代码生成。

    三种菜单内容有点多,不过大体相似,一次性讲完吧,本人偏好代码动态生成,下面就以代码为例。

    1、选项菜单(OptionsMenu)

    先来看下选项菜单的效果图:

     

    在一个Activity界面中点击手机Menu键,在屏幕下方弹出的菜单就叫选项菜单(OptionsMenu)。

    创建一个选项菜单的步骤:
    1、覆写Activity的onCreateOptionsMenu(Menu menu)函数
    2、调用menu的add()方法添加菜单项(MenuItem),可以调用MenuItem的setIcon()方法来为菜单设置图标
    3、当菜单项()被选择时,我们可以通过覆盖Activity的onOptionsItemSeleted()方法来响应事件

    先来了解下主要的方法:

    1   public boolean onCreateOptionsMenu(Menu menu)://使用此方法调用OptionsMenu 。
    2 
    3   public boolean onOptionsItemSelected(MenuItem item)://选中菜单项后发生的动作。
    4 
    5   public void onOptionsMenuClosed(Menu menu): //菜单关闭后发生的动作。
    6 
    7   public boolean onPrepareOptionsMenu(Menu menu)://选项菜单显示之前onPrepareOptionsMenu方法会被调用,你可以用此方法来根据打当时的情况调整菜单。
    8 
    9   public boolean onMenuOpened(int featureId, Menu menu)://单打开后发生的动作。

    下面来看个小Demo,注释很全。

     1 package com.example.menutest;
     2 
     3 import android.app.Activity;
     4 import android.content.Intent;
     5 import android.os.Bundle;
     6 import android.view.Menu;
     7 import android.view.MenuItem;
     8 import android.widget.Toast;
     9 
    10 /**
    11  * 
    12  * @author Balla_兔子
    13  * 用代码动态生成菜单(选项菜单)
    14  *
    15  */
    16 public class MainActivity extends Activity {
    17 
    18     @Override
    19     protected void onCreate(Bundle savedInstanceState) {
    20         super.onCreate(savedInstanceState);
    21         setContentView(R.layout.activity_main);
    22     }
    23     
    24     @Override
    25     //onCreateOptionsMenu()此方法只会调用一次,即第一次显示的时候会调用.
    26     public boolean onCreateOptionsMenu(Menu menu) {
    27 //        MenuItem item1=menu.add(1, 1, 1, "第一个选项菜单");
    28 //        item1.setTitle("第一个选项菜单");
    29 //        item1.setIcon(R.drawable.ic_launcher);
    30         menu.add(1, 1, 1, "第一个选项菜单");
    31         menu.add(1, 2, 1, "第二个选项菜单");
    32         menu.add(1, 3, 1, "第三个选项菜单");
    33         menu.add(1, 4, 1, "第四个选项菜单");        
    34         return super.onCreateOptionsMenu(menu);
    35     }
    36     
    37     @Override
    38     //如果需要更新菜单项.可以在onPrepareOptionsMenu()方法中操作.
    39     public boolean onPrepareOptionsMenu(Menu menu) {
    40         Toast.makeText(this, "菜单显示器前执行的方法", Toast.LENGTH_SHORT).show();
    41         return super.onPrepareOptionsMenu(menu);
    42     }
    43     
    44     @Override
    45     public void onOptionsMenuClosed(Menu menu) {
    46         Toast.makeText(this, "菜单关闭后执行的方法", Toast.LENGTH_SHORT).show();
    47         super.onOptionsMenuClosed(menu);
    48     }
    49     
    50     @Override
    51     //当菜单被选择的时候,在OnOptionsItemSelected()方法中实现.
    52     public boolean onOptionsItemSelected(MenuItem item) {
    53         switch(item.getItemId()){//获取菜单id
    54         case 1:
    55             //可以通过Intent跳转界面
    56             Intent intent=new Intent(MainActivity.this, HelloWorld.class);
    57             item.setIntent(intent);
    58             break;
    59         case 2:
    60             Toast.makeText(this, "第二个选项菜单被点击", Toast.LENGTH_SHORT).show();
    61             break;
    62         case 3:
    63             Toast.makeText(this, "第三个选项菜单被点击", Toast.LENGTH_SHORT).show();
    64             break;
    65         case 4:
    66             Toast.makeText(this, "第四个选项菜单被点击", Toast.LENGTH_SHORT).show();
    67             break;
    68         }
    69         return super.onOptionsItemSelected(item);
    70     }
    71 
    72 }

    上面例子中,在创建菜单方法onCreateOptionsMenu()中有个add方法,它的返回值是一个MenuItem,我们可以根据它的返回值来设置更多选择,例如菜单图标等。

    来看下它的参数,下面是它对应的API文档中的解释:参数1:分组,参数2:标示符id,参数3:排序,参数4:菜单文字

     

     

    2、上下文菜单

    国际惯例,先来看下效果图:

     

     什么是上下文菜单?

    Android 的上下文菜单类似于Windows上的右键菜单。当为一个视图注册了上下文菜单之后,长按(2 秒左右)这个视图对象就会弹出一个浮动菜单,即上下文菜单。任何视图都可以注册上下文菜单,不过,最常见的是用于列表视图ListView的item。

    创建上下文菜单步骤:

    1、 覆写 Activity 的 onCreateContenxtMenu() 方法,调用 Menu 的 add 方法添加菜单项(MenuItem)。

    2、覆盖 Activity 的 onContextItemSelected() 方法,响应上下文菜单菜单项的单击事件。

    3、调用 registerForContextMenu() 方法,为视图注册上下文菜单。

    下面直接上个小Demo演示了,对于ListView组件这里就不再给注释了,不清楚的朋友可以翻下我以前写的文章。

     1 package com.example.menutest;
     2 
     3 import android.app.Activity;
     4 import android.os.Bundle;
     5 import android.view.ContextMenu;
     6 import android.view.ContextMenu.ContextMenuInfo;
     7 import android.view.Menu;
     8 import android.view.MenuItem;
     9 import android.view.View;
    10 import android.widget.ArrayAdapter;
    11 import android.widget.ListView;
    12 import android.widget.Toast;
    13 
    14 /**
    15  * 
    16  * @author Balla_兔子
    17  * 用代码动态生成菜单(上下文菜单)
    18  *
    19  */
    20 public class MainActivity extends Activity  {
    21     
    22     private ListView listview;
    23     private ArrayAdapter<String> adapter;
    24     private String info[]={"选项1","选项2","选项3","选项4","选项5","选项6"};
    25 
    26     @Override
    27     protected void onCreate(Bundle savedInstanceState) {
    28         super.onCreate(savedInstanceState);
    29         setContentView(R.layout.activity_main);
    30         //创建一个ListView列表
    31         listview=(ListView) findViewById(R.id.listview);
    32         adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, info);
    33         listview.setAdapter(adapter);
    34 
    35         
    36         //给当前View注册上下文菜单.
    37         this.registerForContextMenu(listview);
    38             
    39     }
    40     
    41     @Override
    42     public void onCreateContextMenu(ContextMenu menu, View v,
    43             ContextMenuInfo menuInfo) {
    44             menu.setHeaderTitle("我是上下文菜单");//设置上下文菜单题目
    45             menu.setHeaderIcon(R.drawable.ic_launcher);//设置上下文菜单题目图标
    46             menu.add(1, 1, 1, "我是上下文菜单选项1");
    47             menu.add(1, 2, 1, "我是上下文菜单选项2");
    48             menu.add(1, 3, 1, "我是上下文菜单选项3");
    49             menu.add(1, 4, 1, "我是上下文菜单选项4");
    50     }
    51     
    52     @Override
    53     public boolean onContextItemSelected(MenuItem item) {
    54         switch(item.getItemId()){
    55         case 1:
    56             Toast.makeText(this, "点击上下文菜单选项1", Toast.LENGTH_SHORT).show();
    57             break;
    58         case 2:
    59             Toast.makeText(this, "点击上下文菜单选项2", Toast.LENGTH_SHORT).show();
    60             break;
    61         case 3:
    62             Toast.makeText(this, "点击上下文菜单选项3", Toast.LENGTH_SHORT).show();
    63             break;
    64         case 4:
    65             Toast.makeText(this, "点击上下文菜单选项4", Toast.LENGTH_SHORT).show();
    66             break;
    67         
    68         }
    69         return super.onContextItemSelected(item);
    70     }
    71     
    72     @Override
    73     //关闭上下文菜单触发此方法
    74     public void onContextMenuClosed(Menu menu) {
    75         Toast.makeText(this, "关闭上下文菜单", Toast.LENGTH_SHORT).show();
    76     }
    77     
    78 
    79     
    80 
    81 
    82 }

    3、子菜单

    先看下效果图:

     

    创建子菜单的步骤:
    1、 覆写Activity的onCreateOptionsMenu()方法,调用Menu的addSubMenu()方法来添加子菜单
    2、 调用SubMenu的add()方法,添加子菜单项(addSubMenu)
    3、 覆写onOptionsItemSelected()方法,响应子菜单的单击事件

      子菜单提供了一种自然的组织菜单项的方式,我们可以通过addSubMenu(int groupId, int itemId, int order, int titleRes)方法非常方便的创建和响应子菜单。

    代码和之前创建选项菜单,上下文菜单差不多,直接上代码了:

     1 package com.example.menutest;
     2 
     3 import android.app.Activity;
     4 import android.os.Bundle;
     5 import android.view.Menu;
     6 import android.view.MenuItem;
     7 import android.view.SubMenu;
     8 import android.widget.Toast;
     9 
    10 /**
    11  * 
    12  * @author Balla_兔子
    13  * 用代码动态生成菜单(子菜单)
    14  *
    15  */
    16 public class MainActivity extends Activity  {
    17     
    18 
    19     @Override
    20     protected void onCreate(Bundle savedInstanceState) {
    21         super.onCreate(savedInstanceState);
    22         setContentView(R.layout.activity_main);
    23     }
    24     
    25     @Override
    26     public boolean onCreateOptionsMenu(Menu menu) {
    27         SubMenu s1=menu.addSubMenu(1, 0, 1, "我是菜单1");
    28         s1.setIcon(R.drawable.ic_launcher);//设置子菜单图标
    29         s1.setHeaderTitle("子菜单");//设置子菜单标题
    30         s1.add(1, 1, 1, "我是子菜单1");
    31         s1.add(1, 2, 1, "我是子菜单2");
    32         s1.add(1, 3, 1, "我是子菜单3");
    33         s1.add(1, 4, 1, "我是子菜单4");
    34         
    35         SubMenu s2=menu.addSubMenu(2, 0, 1, "我是菜单2");
    36         s2.setIcon(R.drawable.ic_launcher);
    37         s2.setHeaderTitle("子菜单");
    38         s2.add(2, 1, 1, "我是子菜单(1)");
    39         s2.add(2, 2, 1, "我是子菜单(2)");
    40         s2.add(2, 3, 1, "我是子菜单(3)");
    41         s2.add(2, 4, 1, "我是子菜单(4)");
    42         
    43         return super.onCreateOptionsMenu(menu);
    44     }
    45     
    46     @Override
    47     public boolean onOptionsItemSelected(MenuItem item) {
    48         if(item.getGroupId()==1){//判断分组
    49             switch(item.getItemId()){
    50             case 1:
    51                 Toast.makeText(MainActivity.this, "菜单1的子菜单1被点击", Toast.LENGTH_SHORT).show();
    52                 break;
    53             case 2:
    54                 Toast.makeText(MainActivity.this, "菜单1的子菜单2被点击", Toast.LENGTH_SHORT).show();
    55                 break;
    56             case 3:
    57                 Toast.makeText(MainActivity.this, "菜单1的子菜单3被点击", Toast.LENGTH_SHORT).show();
    58                 break;
    59             case 4:
    60                 Toast.makeText(MainActivity.this, "菜单1的子菜单4被点击", Toast.LENGTH_SHORT).show();
    61                 break;
    62             
    63         }
    64             }else if(item.getGroupId()==2){
    65                 switch(item.getItemId()){
    66                 case 1:
    67                     Toast.makeText(MainActivity.this, "菜单2的子菜单1被点击", Toast.LENGTH_SHORT).show();
    68                     break;
    69                 case 2:
    70                     Toast.makeText(MainActivity.this, "菜单2的子菜单2被点击", Toast.LENGTH_SHORT).show();
    71                     break;
    72                 case 3:
    73                     Toast.makeText(MainActivity.this, "菜单2的子菜单3被点击", Toast.LENGTH_SHORT).show();
    74                     break;
    75                 case 4:
    76                     Toast.makeText(MainActivity.this, "菜单2的子菜单4被点击", Toast.LENGTH_SHORT).show();
    77                     break;
    78                 }
    79             }
    80     
    81         return super.onOptionsItemSelected(item);
    82     }
    83 
    84 }
  • 相关阅读:
    数据结构--线性表和链表的基础知识
    OC基础--字符串
    iOS开发知识梳理博文集
    OC基础--数据类型与表达式
    数据结构概述
    数据结构--栈和队列基础知识
    NodeJS Get/Post 参数获取
    NodeJS + express 添加HTTPS支持
    NodeJS 获取系统时间 并格式化输出
    Node.Js + Express 搭建服务器
  • 原文地址:https://www.cnblogs.com/lichenwei/p/3963358.html
Copyright © 2011-2022 走看看