创建Menu 资源文件
菜单资源文件通常应该定义在res/menu 目录下,包含的元素有:
<menu>
通常作为菜单资源的根元素,可以包含多个<item> 和<group>
<item>
用于定义菜单项。可选的属性有id, title, icon 等,具体课参考文档的说明
<group>
可选标记,将多个菜单项<item> 包装成一个菜单组。可选的属性也有id, enabled, visible 等,具体也可参考官方文档
下面是一个简单的例子:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/color_red"
android:title="红色"/>
<item
android:id="@+id/color_green"
android:title="绿色"/>
<item
android:id="@+id/color_blue"
android:title="蓝色"/>
<item
android:id="@+id/color_orange"
android:title="橙色"/>
<item
android:id="@+id/color_default"
android:title="默认"/>
</menu>
创建上下文菜单
为相应的组件注册上下文菜单
使用registerForContextMenu() 并传递相应的view 对象作为参数,可以为该view 对象注册上下文菜单,例如,为一个TextView 注册上下文菜单:
textView = (TextView) findViewById(R.id.text_view);
registerForContextMenu(textView);
重写Activity 中的onCreateContextMenu() 方法
这个方法用于创建上下文菜单:
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
}
MenuInflater 对象可以通过inflate() 方法加载资源文件。此外,在这里也可以通过setHeaderIcon() 和setHeaderTitle() 等一些方法创建菜单的标题和图标等。
重写Activity 中的onContextItemSelected() 方法
当菜单项被选中的时候,执行这个回调方法。可以再这个方法中响应菜单操作:
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId()) {
case R.id.edit:
...
return true;
case R.id.delete:
...
return true;
default:
return super.onContextItemSelected(item);
}
}
一个完整的例子如下
这个例子可以通过TextView 的上下文菜单改变文字的颜色:
text_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/color_red"
android:title="红色"/>
<item
android:id="@+id/color_green"
android:title="绿色"/>
<item
android:id="@+id/color_blue"
android:title="蓝色"/>
<item
android:id="@+id/color_orange"
android:title="橙色"/>
<item
android:id="@+id/color_default"
android:title="默认"/>
</menu>
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.demo34.MainActivity" >
<TextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="28sp"
android:text="@string/hello_world" />
</RelativeLayout>
MainActivity.java
public class MainActivity extends Activity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.text_view);
registerForContextMenu(textView);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.text_menu, menu);
menu.setHeaderIcon(R.drawable.ic_launcher);
menu.setHeaderTitle("请选择文字颜色");
}
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.color_red:
textView.setTextColor(Color.rgb(255, 0, 0));
break;
case R.id.color_green:
textView.setTextColor(Color.rgb(0, 255, 0));
break;
case R.id.color_blue:
textView.setTextColor(Color.rgb(0, 0, 255));
break;
case R.id.color_orange:
textView.setTextColor(Color.rgb(255, 150, 0));
break;
case R.id.color_default:
textView.setTextColor(Color.rgb(0, 0, 0));
break;
default:
return super.onContextItemSelected(item);
}
return true;
}
}