上下文菜单
Android用ContextMenu来代表上下文菜单,为Android应用开发上下文菜单与开发选项菜单的方法基本相似,因为ContextMenu继承了Menu,因此程序可用相同的方法为它添加菜单项。
当然,开发上下文菜单与开发选项菜单的区别在于:开发上下文菜单不是重写onCreateOptionsMenu(Menu menu)方法,而是重写onCreateContextMenu(ContextMenu menu,View source,ContextMenu.ContextMenuInfo menuInfo)方法。其中source参数代表触发上下文菜单的组件。
开发上下文菜单的步骤如下。
①重写Activity的onCreteContextMenu(ContextMenu menu,View source,ContextMenu.ContextMenuInfo menuInfo)方法。
②调用Activity的registerForContextMenu(View view)方法为view组件注册上下文菜单。
③如果希望应用程序能为菜单项提供相应,可以重写onContextItemSelected(MenuItem mi)方法,或为指定菜单项绑定事件监听器。
ContextMenu提供了如下方法,同样可以为上下文菜单设置图标、标题等。
- ContextMenu setHeaderIcon(Drawable icon):为上下文菜单设置图标。
- ContextMenu setHeaderIcon(int iconRes):为上下文菜单设置图标。
- ContextMenu setHeaderTitle(int titleRes):为上下文菜单设置标题。
该程序的界面布局文件如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/txt" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="15pt" android:text="可通过上下文菜单修改背景色" /> </LinearLayout>
该程序对应的后台Activity代码如下:
package org.crazyit.helloworld; import android.os.Bundle; import android.app.Activity; import android.graphics.Color; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.TextView; public class ContextMenuTest extends Activity { //为每个菜单定义一个标识 final int MENU1=0x111; final int MENU2=0x112; final int MENU3=0x113; private TextView txt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.context_menu_test); txt=(TextView)findViewById(R.id.txt); //为文本框注册上下文菜单 registerForContextMenu(txt);//① } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.context_menu_test, menu); return true; } //创建上下文菜单时触发该方法 @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { menu.add(0,MENU1,0,"红色"); menu.add(0,MENU2,0,"绿色"); menu.add(0,MENU3,0,"蓝色"); //将三个菜单项设为单选菜单项 menu.setGroupCheckable(0, true, true); //设置上下文菜单的标题、图标 menu.setHeaderIcon(R.drawable.tools); // TODO Auto-generated method stub //super.onCreateContextMenu(menu, v, menuInfo); menu.setHeaderTitle("选择背景色"); } //上下文菜单的菜单项被单击时触发该方法 @Override public boolean onContextItemSelected(MenuItem mi) { switch(mi.getItemId()) { case MENU1: mi.setCheckable(true); txt.setBackgroundColor(Color.RED); break; case MENU2: mi.setCheckable(true); txt.setBackgroundColor(Color.GREEN); break; case MENU3: mi.setCheckable(true); txt.setBackgroundColor(Color.BLUE); break; } // TODO Auto-generated method stub //return super.onContextItemSelected(mi); return true; } }
上面的程序重写了onCreateContextMenu(ContextMenu menu,View source,ContextMenu.ContextMenuInfo menuInfo)方法,该方法的内部为程序创建了一个上下文菜单。
程序在①号代码除调用registerForContextMenu(txt)为txt组件(一个文本框组件)注册了上下文菜单,这意味着当用户长按该组时显示上下文菜单。上下文菜单如图所示。