使用上下文菜单(Context Menu)

本文介绍了如何在Android应用中创建和使用上下文菜单。首先,讲解了在res/menu目录下创建菜单资源文件,包括<menu>, <item>和<group>元素的使用。接着,说明了如何通过registerForContextMenu()方法为组件注册上下文菜单,并重写onCreateContextMenu()方法来创建菜单。最后,阐述了onContextItemSelected()方法的作用,即在菜单项被选中时进行相应操作,提供了一个通过上下文菜单改变TextView文字颜色的完整示例。" 90666071,4898157,Android EditText详解:属性与操作,"['Android开发', 'UI组件', 'EditText属性', '键盘控制']
摘要由CSDN通过智能技术生成

创建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;
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值