通过menu resource 定义menu结构,具体做法如下:
在/res目录下新建目录 /menu,在menu目录下新建名为example_menu.xml的xml文件,xml文件代码如下
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/item1"
android:title="@string/item1"
/>
<group android:id="@+id/group">
<item android:id="@+id/group_item1"
android:onClick="onGroupItemClick"
android:title="@string/group_item1"
/>
<item android:id="@+id/group_item2"
android:onClick="onGroupItemClick"
android:title="@string/group_item2"
/>
</group>
<item android:id="@+id/submenu"
android:title="@string/submenu_title"
>
<menu>
<item android:id="@+id/submenu_item1"
android:title="@string/submenu_item1" />
</menu>
</item>
</menu>
其中上述文件中引用了/values/strings.xml中常量,strings.xml文件定义如下
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, Example_Menu!</string>
<string name="app_name">Example_Menu</string>
<string name="item1">item1</string>
<string name="group_item1">group_item1</string>
<string name="group_item2">group_item2</string>
<string name="submenu_title">submenu_title</string>
<string name="submenu_item1">submenu_item1</string>
</resources>
最后我们在activity文件中写如下代码生成并显示menu对象,只需复写activity中的onCreateOptionsMenu和onMenuItemSelected函数。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
//获取Menu文件
MenuInflater inflater = this.getMenuInflater();
//把获取的menu文件实例填充到menu对象中
inflater.inflate(R.menu.example_menu, menu);
return true;
}
/**
* 响应注册了这个方法的MenuItem
* @param item
*/
public void onGroupItemClick(MenuItem item) {
Log.d("h", ""+item.getItemId());
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
// TODO Auto-generated method stub
Toast.makeText(this, "你点击了我"+item.getItemId(), Toast.LENGTH_SHORT).show();
return super.onMenuItemSelected(featureId, item);
}
运行效果如下:
这种构造menu的方法很方便吧。
遇到的问题:
大家应该注意到example_menu.xml文件中两个item标签中android:onClick="onGroupItemClick"属性应该响应我在activity中定义的onGroupItemClick(MenuItem item)方法的,
不过结果并不是那样,而帮助文档中说得很清除这个方法执行的优先级高于 onMenuItemSelected,但这个方法确实没有执行到,
一个可能是SDK版本问题,机子上的2.2,难道3.0才支持?求解答