Menu在Android开发中很常用,一般情况下,创建一个菜单有两种方法。一种是在机子本身带的Menu按键上创建一个菜单,另外一种是利用OnCreateContextMenu创建一个菜单,下面是这两种方法的具体实现方式。
第一种方法
<1> 当在机子本身带的Menu按键上创建一个菜单时,我们要重写Activity中的onCreateOptionsMenu和onOptionsItemSelected以及onPrepareOptionsMenu方法
1·onCreateOptionsMenu例子
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, 1, 1, "exit").setIcon(android.R.drawable.ic_delete);//可以设置菜单选项的图片
menu.add(0, 2, 1, "about");//groupId,itemId,order,title参数具体含义见最后注释
menu.add(1, 3, 2, "help");
menu.add(1, 4, 2, "send");
menu.add(2, 5, 2, "call");
menu.add(2, 6, 1, "tom");
menu.add(2, 7, 1, "john");
return super.onCreateOptionsMenu(menu); }
运行界面如下:
当你创建的菜单中含有6个以上的项目时,由于不能完全显示,所以会用一个“更多”按钮来显示。onPrepareOptionsMenu方法是在创建完菜单后对菜单进行管理,在这里我们可以设置一个菜单项不可用,或者可以利用创建菜单时设置的groupId来对相同的一组菜单项进行管理。
2·onOptionsItemSelected例子
根据业务需求,你想让你创建的菜单中的各个项目实现什么功能,这是要用到onOptionsItemSelected来实现菜单项的各个功能。下面是我自己实现的一个很简单的功能,在这里只是为了说明这个方法怎么用。所以写的很简单。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
Intent intent=new Intent();
switch (id) {
case 1:
finish();//退出
break;
case 2:
Toast.makeText(TestMenuActivity.this, "this is a joke!",
Toast.LENGTH_LONG).show();//toast显示一下
break;
case 4:
intent.setClass(TestMenuActivity.this,OtherActivity.class );
TestMenuActivity.this.startActivity(intent);//跳转到另一个页面
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
第二种方法
当我们不希望利用机子本身带的Menu来创建菜单时,我们可以利用Activity中的任何控件来创建监听,来实现创建菜单的功能。在这里我们要用到onCreateContextMenu和onContextItemSelected方法。用到了setOnCreateContextMenuListener来创建一个监听。
在利用onCreateContextMenu方法创建菜单时,这里又有两种方法可以实现,一种是在res中创建一个Menu文件夹,在该文件夹中创建一个xml文件,通过设计xml实现一个菜单(<menu></menu>)。然后在方法中利用MenuInflater inflater = getMenuInflater();inflater.inflate(R.menu.xml文件名, menu);方法引用这个菜单。另一种是直接在该方法中使用add方法进行添加。下面是我自己为了说明这两种方法的使用做的一个简单的创建菜单的代码:
Activity中的代码:
1findViewById(R.id.textView).setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() {
2
3 @Override
4 public void onCreateContextMenu(ContextMenu menu, View v,
5 ContextMenuInfo menuInfo) {
6 MenuInflater inflater = getMenuInflater();
7 inflater.inflate(R.menu.menu1, menu);
8 //menu.add(0, 1, 1, "tom");
9 }
10 });
这里我在res中创建一个Menu文件夹,在该文件夹中创建一个menu.xml文件
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single">
<item android:id="@+id/new_game" android:title="New Game" />
<item android:id="@+id/quit" android:title="Quit" />
</group>
</menu>
另外一种是在我们重写onCreateContextMenu方法时,直接利用menu添加菜单。在这里我就不具体说明怎么做了。其结果和上面的结果是一样的。
在创建外菜单后,我们还是要对菜单进行功能的实现。在这里就要重写onContextItemSelected方法。下面是我为了说明这个方法的用法写的一段简单代码供大家参考。
1@Override
2 public boolean onContextItemSelected(MenuItem item) {
3 AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
4 .getMenuInfo();
5 Intent intent=new Intent();
6 switch (item.getItemId()) {
7 case R.id.new_game:
8 intent.setClass(TestMenuActivity.this,OtherActivity.class );
9 TestMenuActivity.this.startActivity(intent);//Activity跳转
10 /*Toast.makeText(TestMenuActivity.this, "this is a new_game",
11 Toast.LENGTH_LONG).show();*/
12 return true;
13 case R.id.quit:
14 finish();//结束退出
15 return true;
16 default:
17 return super.onContextItemSelected(item);
18 }
19 }
注释
看一看menu.add方法的参数:
第一个int类型的group ID参数,代表的是组概念,你可以将几个菜单项归为一组,以便更好的以组的方式管理你的菜单按钮。第二个int类型的item ID参数,代表的是项目编号。这个参数非常重要,一个item ID对应一个menu中的选项。在后面使用菜单的时候,就靠这个item ID来判断你使用的是哪个选项。
第三个int类型的order ID参数,代表的是菜单项的显示顺序。默认是0,表示菜单的显示顺序就是按照add的显示顺序来显示。
第四个String类型的title参数,表示选项中显示的文字。