4.5 菜单Menu
Android的菜单主要分两种,一种是选项菜单OptionMenu,通过按菜单键或点击事件触发,另一种是上下文菜单ContextMenu,通过长按事件触发。页面的布局文件放在res/layout目录下,菜单的布局文件存放在res/menu目录下。
1.选项菜单OptionMenu
弹出选项菜单的途径有3种:
(1)按菜单键
(2)在代码中手动打开选项菜单,即调用openOptionsMenu方法
(3)按工具栏右侧的溢出菜单按钮
实现选项菜单的功能需要重写以下两种方法:
onCreateOptionsMenu:在页面打开时调用,需要指定菜单列表的XML文件
onOptionsItemSelected:在列表的菜单项被选中时调用,需要对不同的菜单项做分支处理
菜单布局文件的代码样例:
<menu xmlns:android=http://schemas.android.com/apk/res/android>
<item
android:id=”@+id/menu_change_time”
android:orderInCategory=”1”
android:title=”改变时间”/>
<item
android:id=”@+id/menu_change_color”
android:orderInCategory=”8”
android:title=”改变颜色”/>
<item
android:id=”@+id/menu_change_bg”
android:orderInCategory=”9”
android:title=”改变背景”/>
</menu>
接下来是使用选项菜单的代码片段:
@Override
public Boolean onCreateOptionsMenu(Menu menu){
getMenuInflater().inflate(R.menu.menu_option, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if(id == R.id.……)……
else if…… ……
return true;
}
2.上下文菜单ContextMenu
弹出上下文菜单的途径有两种:
(1)默认在某个控件被长按时弹出,通常在onStart函数中加入registerForContextMenu方法为指定控件注册上下文菜单,在onStop函数中加入unregisterForContextMenu方法为指定控件注销上下文菜单。
(2)在除长按事件之外的其他事件中打开上下文菜单,先执行registerForContextMenu方法注册菜单,然后执行openContextMenu方法打开菜单,最后执行unregisterForContextMenu方法注销菜单
实现上下文菜单的功能需要重写以下两种方法:
onCreateContextMenu:在此指定菜单列表的XML文件,作为上下文菜单列表项的来源
onContextItemSelected:在此对不同的菜单项做分支处理
上下文菜单的布局文件格式同选项菜单,下面是使用上下文菜单的代码片段:
@Override
public void onClick(View v) {
if (v.getId() == R.id.btn_context) {
registerForContextMenu(v);
openContextMenu(v);
unregisterForContextMenu(v);
}
}
@Override
protected void onResume() {
registerForContextMenu(tv_context);
super.onResume();
}
@Override
protected void onPause() {
unregisterForContextMenu(tv_context);
super.onPause();
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
{
getMenuInflater().inflate(R.menu.menu_option,
menu);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == ……)
else if(id == ……)
return true;
}
原文地址:https://www.cnblogs.com/Briddle-ch/p/8479658.html