本文介绍Menu。主要介绍两个方面:Menu的基本用法 以及 在ListView或GridView中长按弹出浮动Menu才当的用法。
Menu的基本用法
点击查看:Menu的基本用法完整代码
注意:由于Menu是显示在ActionBar上的,因此需要在manfest中添加相关主题。例如:
android:theme="@android:style/Theme.Holo.Light.DarkActionBar"
当然,也可以是"@android:style/Theme.Holo"主题。
1. 定义menu菜单
新建res/menu/menu.xml,内容如下:
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- search -->
<item android:id="@+id/search"
android:icon="@drawable/ic_action_search"
android:title="@string/search"
android:showAsAction="ifRoom" />
<!-- setting -->
<item android:id="@+id/setting"
android:title="@string/setting"
android:showAsAction="ifRoom|withText" />
<item android:id="@+id/file"
android:title="@string/file" >
<!-- sub menu -->
<menu>
<item android:id="@+id/create_new"
android:title="@string/create_new" />
<item android:id="@+id/open"
android:title="@string/open" />
</menu>
</item>
</menu>
说明:关于android:showAsAction的基本含义在介绍ActionBar时已经说过了。这里再罗嗦一次。
android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]
(01) ifRoom -- 如果有空间,则显示该按钮。
(02) withText -- 显示文本。
(03) never -- 不将该按钮显示在ActionBar上。
(04) always -- 总是将该按钮显示在ActionBar上。
(05) collapseActionView -- 将按钮组合到ActionBar中。
2. 覆盖onCreateOptionsMenu()
在onCreateOptionsMenu()中展开菜单。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu items for use in the action bar
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return super.onCreateOptionsMenu(menu);
}
3. 响应菜单点击事件
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.search:
Toast.makeText(getApplicationContext(), "search", 0).show();
return true;
case R.id.setting:
Toast.makeText(getApplicationContext(), "setting", 0).show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
悬浮Menu的基本用法
点击查看:悬浮Menu的完整代码
这里以ListView为例,介绍长按ListView中的子项弹出悬浮菜单的方法。
1. 定义Menu配置文件
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- search -->
<item android:id="@+id/delete"
android:title="@string/delete"
android:showAsAction="ifRoom" />
<!-- setting -->
<item android:id="@+id/share"
android:title="@string/share"
android:showAsAction="ifRoom|withText" />
<item android:id="@+id/detail"
android:title="@string/detail"
android:showAsAction="ifRoom|withText" />
</menu>
2. 调用registerForContextMenu()接口进行菜单注册
registerForContextMenu(listView);
说明:listView是ListView对象。
3. 覆盖onCreateContextMenu()
注意:这里的onCreateContextMenu()和前面的onCreateContextMenu()不一样!它们的参数个数不同!
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
}
4. 覆盖onContextItemSelected()
注意:和前面的onOptionsItemSelected()不一样,onContextItemSelected()才是悬浮菜单选择的回调事件!
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId()) {
case R.id.delete:
Toast.makeText(getApplicationContext(), "delete menu", 0).show();
return true;
case R.id.share:
Toast.makeText(getApplicationContext(), "share menu", 0).show();
return true;
case R.id.detail:
Toast.makeText(getApplicationContext(), "detail menu", 0).show();
return true;
default:
return super.onContextItemSelected(item);
}
}