一、前言
转载请标明出处:http://blog.csdn.net/wlwlwlwl015/article/details/42170771
本篇blog将记录一下Android中菜单的使用方法,虽然在新版本中推荐使用ActionBar去替代菜单,但我认为菜单依然是挺不错的一种UI交互组件,比ActionBar好点一些,对于手指不灵活的人比起来ActionBar右上角的那个方块小按钮,或许ta会更喜欢Menu呢,废话不多说,下面就具体介绍一下Android中关于Menu的使用方法。
二、创建第一个菜单
菜单有两种创建方式,分别是:
- 通过Java代码创建菜单对象。
- 通过xml资源文件定义菜单。
这里我想也不必多说,肯定应该选择第二种形式,在Activity中写代码去创建菜单必然导致程序代码过于臃肿,而且也不易查看和维护,而第二种方法既容易观察菜单的结构,也降低了耦合性,下面是官方给出的将“Using a menu resource”作为最佳实践的理由,简单看一下:
所以我这里就不浪费篇幅去记录“通过代码去创建菜单”了,主要记录一下如何通过xml文件定义菜单资源以及如何在Activity中引用并设置以及使用菜单。
菜单的资源文件通常应该放在/res/menu目录下,菜单资源的根元素通常是<menu.../>元素,并且它不需要指定任何属性,仅是菜单资源文件的根标签而已。我们在eclipse中新建一个Android工程,在/res/menu下去new一个Menu Resource,可以看到Menu的基本结构:
可以看到<menu.../>元素内可包含的子元素:
- <group></group>
- <item/>
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/item_1"
android:title="title1"/>
<item
android:id="@+id/item_2"
android:title="title2"/>
<item
android:id="@+id/item_3"
android:title="title3"/>
<item
android:id="@+id/item_4"
android:title="title4"/>
<item
android:id="@+id/item_5"
android:title="title5"/>
<item
android:id="@+id/item_6"
android:title="title6"/>
</menu>
写好了资源文件之后,在Activity中需要重写onCreateOptionsMenu去加载菜单,加载方式也很简单,通过MenuInflater的inflate方法即可加载菜单,完全类似于我们LayoutInflater的用法。关于菜单Item的点击事件需要在Activity中重写onOptionsItemSelected,根据回调参数来判断不同的Item从而进行不同的处理,其实这些在新建Activity之后都会自动生成的,下面贴上这两个方法的代码,很简单:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.my_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
switch (id) {
case R.id.item_1:
Toast.makeText(this, "item_1 has been clicked!", Toast.LENGTH_SHORT)
.show();
;
break;
case R.id.item_2:
Toast.makeText(this, "item_2 has been clicked!", Toast.LENGTH_SHORT)
.show();
break;
case R.id.item_3:
Toast.makeText(this, "item_3 has been clicked!", Toast.LENGTH_SHORT)
.show();
break;
case R.id.item_4:
Toast.makeText(this, "item_4 has been clicked!", Toast.LENGTH_SHORT)
.show();
break;
case R.id.item_5:
Toast.makeText(this, "item_5 has been clicked!", Toast.LENGTH_SHORT)
.show();
break;
case R.id.item_6:
Toast.makeText(this, "item_6 has been clicked!", Toast.LENGTH_SHORT)
.show();
break;
}
return true;
}
最后看一下运行效果: