系统组件:菜单Menu(1)

  常用的菜单有:

    OptionMenu(系统菜单):当点击手机的菜单键时,出现在应用顶部下的菜单。

    ContextMenu(上下文菜单):当长按某一UI控件时,出现的菜单。

    PopupMenu(弹出菜单):当点击某一UI控件时,弹出的菜单。

    SubMenu(子菜单):当点击某一菜单的菜单项时,出现的下一级菜单。

    

    下面主要总结前三种菜单的用法:

    1.OptionMenu使用:重写Activity的回调方法onCreateOptionsMenu()创建选项菜单,同时一般肯定会对菜单项进行监听,所以同时会重写onOptionsItemSelected()。菜单项可以在menu文件夹下定义xml菜单项文件。

  eg:

1 // 创建系统菜单
2     @Override
3     public boolean onCreateOptionsMenu(Menu menu) {
4         // 将Menu文件转化为菜单的菜单项
5         getMenuInflater().inflate(R.menu.main, menu);
6         return true;
7     }

getMenuInflater()获得一个MenuInflater对象,和getLayoutInflater()方法类似,都是获取一个Inflater对象,其中getMenuInflater().inflater()是将菜单项布局文件转换为视图对象进而绑定在系统菜单上,而getLayoutInflater().inflater()则是将指定布局xml文件转化为View对象。进一步扩展,在非Activity中获取LayoutInflater对象,可以通过LayoutInflater.from(context)得到,但是没有MenuInflater.from(context)方法。

1 // 设置点击系统菜单项的监听事件
2     @Override
3     public boolean onOptionsItemSelected(MenuItem item) {
4         Toast.makeText(this, "点击了" + item.getTitle(), Toast.LENGTH_SHORT)
5                 .show();
6         return super.onOptionsItemSelected(item);
7     }

new MenuItem().getTitle()是一个比较有用的方法,菜单项的定义一般是用xml文件定义的,那么怎么获取xml文件中菜单项显示的文本呢?通过MunuItem的getTitle()这个方法可以获取xml文件中定义的菜单项文本,也就是获取了界面上出现的菜单项中文本。

点击菜单键出现的系统菜单效果图:

    2.ContextMenu使用:第一步需要为需要添加上下文菜单的控件注册,通过调用registerForContextMenu(view)来完成注册,第二步是通过重写onCreateContextMenu()方法创建上下文菜单,第三部也就是为上下文菜单中的菜单项添加监听事件,重写onContextItemSelected完成事件监听。可以看到后两步的操作和OptionMenu思路类似,唯一不同的是ContextMenu必须要注册才能使用。

eg:

1 // 为listView注册上下文菜单
2         registerForContextMenu(listView);
1 // 创建上下文菜单
2     @Override
3     public void onCreateContextMenu(ContextMenu menu, View v,
4             ContextMenuInfo menuInfo) {
5         // 将Menu文件转化为菜单的菜单项
6         getMenuInflater().inflate(R.menu.context_menu, menu);
7         super.onCreateContextMenu(menu, v, menuInfo);
8     }
1 // 设置点击上下文菜单项的监听事件
2     @Override
3     public boolean onContextItemSelected(MenuItem item) {
4         Toast.makeText(this, "点击了" + item.getTitle(), Toast.LENGTH_SHORT)
5                 .show();
6         return super.onContextItemSelected(item);
7     }

ContextMenu使用的后两个方法结构和OptionMenu使用的方法完全相同。

长按ListView中的任意一项数据项出现的ContextMenu效果图:

    3.PopupMenu的使用:首先为某个控件添加点击事件,然后在调用的点击事件中创建PopupMenu对象,为PopupMenu对象设置菜单项,为PopupMenu设置监听事件,最后将PopupMenu显示出来。

 1 // 点击按钮时,出现弹出菜单
 2     public void popupMenu(View view) {
 3         // 第二个参数是设置弹出菜单出现在那个组件上
 4         PopupMenu popupMenu = new PopupMenu(this, view);
 5 
 6         // 为弹出菜单添加菜单项
 7         // new PopupMenu().getMenu(),返回一个Menu对象
 8         getMenuInflater().inflate(R.menu.popup_menu, popupMenu.getMenu());
 9 
10         // 设置弹出菜单项的监听事件
11         popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
12             @Override
13             public boolean onMenuItemClick(MenuItem item) {
14                 Toast.makeText(MainActivity.this, "点击了" + item.getTitle(),
15                         Toast.LENGTH_SHORT).show();
16                 return false;
17             }
18         });
19 
20         // 将弹出菜单显示出来
21         popupMenu.show();
22     }

点击按钮出现的PopupMenu的效果图:

示例:初始界面如下图,上方是一个ListView,下方是一个按钮,当点击返回键出现系统菜单,当点击ListView的任意一个数据项出现上下文菜单,当点击下方的按钮出现弹出菜单.

MainActivity的源代码:

 1 package com.my.day22_my_menu;
 2 
 3 import android.os.Bundle;
 4 import android.app.Activity;
 5 import android.view.ContextMenu;
 6 import android.view.Menu;
 7 import android.view.MenuItem;
 8 import android.view.View;
 9 import android.view.ContextMenu.ContextMenuInfo;
10 import android.widget.ArrayAdapter;
11 import android.widget.ListView;
12 import android.widget.PopupMenu;
13 import android.widget.PopupMenu.OnMenuItemClickListener;
14 import android.widget.Toast;
15 
16 public class MainActivity extends Activity {
17     private ListView listView;
18 
19     @Override
20     protected void onCreate(Bundle savedInstanceState) {
21         super.onCreate(savedInstanceState);
22         setContentView(R.layout.activity_main);
23 
24         listView = (ListView) findViewById(R.id.listView);
25         listView.setAdapter(new ArrayAdapter<String>(this,
26                 android.R.layout.simple_list_item_1, new String[] { "第一条数据项",
27                         "第二条数据项", "第三条数据项" }));
28 
29         // 为listView注册上下文菜单
30         registerForContextMenu(listView);
31     }
32 
33     // 创建系统菜单
34     @Override
35     public boolean onCreateOptionsMenu(Menu menu) {
36         // 将Menu文件转化为菜单的菜单项
37         getMenuInflater().inflate(R.menu.main, menu);
38         return true;
39     }
40 
41     // 设置点击系统菜单项的监听事件
42     @Override
43     public boolean onOptionsItemSelected(MenuItem item) {
44         Toast.makeText(this, "点击了" + item.getTitle(), Toast.LENGTH_SHORT)
45                 .show();
46         return super.onOptionsItemSelected(item);
47     }
48 
49     // 创建上下文菜单
50     @Override
51     public void onCreateContextMenu(ContextMenu menu, View v,
52             ContextMenuInfo menuInfo) {
53         // 将Menu文件转化为菜单的菜单项
54         getMenuInflater().inflate(R.menu.context_menu, menu);
55         super.onCreateContextMenu(menu, v, menuInfo);
56     }
57 
58     // 设置点击上下文菜单项的监听事件
59     @Override
60     public boolean onContextItemSelected(MenuItem item) {
61         Toast.makeText(this, "点击了" + item.getTitle(), Toast.LENGTH_SHORT)
62                 .show();
63         return super.onContextItemSelected(item);
64     }
65 
66     // 点击按钮时,出现弹出菜单
67     public void popupMenu(View view) {
68         // 第二个参数是设置弹出菜单出现在那个组件上
69         PopupMenu popupMenu = new PopupMenu(this, view);
70 
71         // 为弹出菜单添加菜单项
72         // new PopupMenu().getMenu(),返回一个Menu对象
73         getMenuInflater().inflate(R.menu.popup_menu, popupMenu.getMenu());
74 
75         // 设置弹出菜单项的监听事件
76         popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
77             @Override
78             public boolean onMenuItemClick(MenuItem item) {
79                 Toast.makeText(MainActivity.this, "点击了" + item.getTitle(),
80                         Toast.LENGTH_SHORT).show();
81                 return false;
82             }
83         });
84 
85         // 将弹出菜单显示出来
86         popupMenu.show();
87     }
88 }
View Code

未完,待续。

原文地址:https://www.cnblogs.com/enjoy-coding/p/4796202.html