安卓开发_浅谈ContextMenu(上下文菜单)

时间:2022-04-04 06:37:33

长下文菜单,即长按view显示一个菜单栏

与OptionMenu的区别
OptionMenu对应的是activity,一个activity只能拥有一个选项菜单
ContextMenu对应的是View,每个View都可以设置上下文菜单
一般情况下ContextMenu常用语ListView或者GridView;

创建和响应上下文菜单过程:

1.在activity的onCreate(...)方法中为一个view注册上下文菜单

2.在onCreateContextMenuInfo(...)中生成上下文菜单。

3.在onContextItemSelected(...)中响应上下文菜单项。

有两种方式实现:

一、java代码动态实现

 menu.setHeaderTitle("操作");
menu.setHeaderIcon(R.drawable.icon_72); //动态添加上下文菜单
menu.add(, , , "复制");
menu.add(, , , "粘贴");
menu.add(, , , "剪切");

二、xml文件静态实现

 MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);//第一个参数是xml文件 第二个参数是menu菜单
inflater.inflate(R.menu.main, menu);//第一个参数是xml文件  第二个参数是menu菜单
看这一行代码,
我们找到其对应的文件

安卓开发_浅谈ContextMenu(上下文菜单)

main.xml文件代码如下:

 <menu xmlns:android="http://schemas.android.com/apk/res/android" >

     <item
android:id="@+id/action_menu_1"
android:orderInCategory=""
android:showAsAction="never"
android:title="复制"/>
<item
android:id="@+id/action_menu_2"
android:orderInCategory=""
android:showAsAction="never"
android:title="粘贴"/>
<item
android:id="@+id/action_menu_3"
android:orderInCategory=""
android:showAsAction="never"
android:title="剪切"/> </menu>

可以看到两个菜单项,看下菜单项的各个属性:

1、 android:id=   
是菜单项id
2、android:orderInCategory=
是菜单项优先级,值越大,优先级越多,当菜单项过多时,可隐藏在折叠菜单中
3、android:showAsAction=

  原来是特定版本用到的,当你的应用程序目标设为蜂巢平台(即 Android 3.0)时,你可以利用Action Bar部件提供的全部功能,将你的选项菜单项放在Action Bar的右上角,  对用户来说使用更方便,控制该行为的主菜单项属性是android:showAsAction。 这个属性可接受的值有:

    1.alaways:这个值会使菜单项一直显示在ActionBar上。

    2.ifRoom:如果有足够的空间,这个值会使菜单显示在ActionBar上。

    3.never:这个值菜单永远不会出现在ActionBar是。

    4.withText:这个值使菜单和它的图标,菜单文本一起显示。

4、android:title=
是菜单项名字

1)注册上下文菜单

 this.registerForContextMenu(list);

2)生成上下文菜单

 //创建上下文菜单
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
super.onCreateContextMenu(menu, v, menuInfo);
//设置menu显示的内容 menu.setHeaderTitle("操作"); //菜单栏标题
menu.setHeaderIcon(R.drawable.icon_72); //菜单栏图标 //动态添加上下文菜单
// menu.add(1, 100, 1, "复制");
// menu.add(1, 101, 1, "粘贴");
// menu.add(1, 102, 1, "剪切");
//xml文件静态创建
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);//第一个参数是xml文件 第二个参数是menu菜单
}

在onCreateContextMenu()方法中获得点击的列表项

 AdapterContextMenuInfo menuInfos = (AdapterContextMenuInfo) menuInfo;
curItemPosition = menuInfos.position;(curItemPosition 代表点击列表中第几项出现的上下文菜单)

3)响应上下文菜单项

 @Override
public boolean onContextItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case :
Toast.makeText(ContextMenu_List.this, "选择的复制操作", ).show();
break;
case :
Toast.makeText(ContextMenu_List.this, "选择的粘贴操作", ).show();
break;
case :
Toast.makeText(ContextMenu_List.this, "选择的剪切操作", ).show();
break; default:
break;
}
return super.onContextItemSelected(item); }

完整代码:

 package information;

 import com.example.allcode.R;

 import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.animation.AnimationUtils;
import android.view.animation.LayoutAnimationController;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.Toast; public class ContextMenu_List extends Activity{
private ListView list;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.donghua_layout); list = (ListView) findViewById(R.id.listView1);
this.registerForContextMenu(list);
//为列表视图中选中的项添加响应事件
list.setOnItemClickListener(new OnItemClickListener() { @Override
public void onItemClick(AdapterView<?> parent, View arg1, int pos,
long id) {
// TODO Auto-generated method stub
String result = parent.getItemAtPosition(pos).toString(); //获取选择项的值
Toast.makeText(ContextMenu_List.this, "点击了 "+result, Toast.LENGTH_SHORT).show();//输出选中项消息
}
}); }
//创建上下文菜单
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
super.onCreateContextMenu(menu, v, menuInfo);
//设置menu显示的内容 menu.setHeaderTitle("操作");
menu.setHeaderIcon(R.drawable.icon_72); //动态添加上下文菜单
// menu.add(1, 100, 1, "复制");
// menu.add(1, 101, 1, "粘贴");
// menu.add(1, 102, 1, "剪切");
//xml文件静态创建
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);//第一个参数是xml文件 第二个参数是menu菜单
} @Override
public boolean onContextItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case :
Toast.makeText(ContextMenu_List.this, "选择的复制操作", ).show();
break;
case :
Toast.makeText(ContextMenu_List.this, "选择的粘贴操作", ).show();
break;
case :
Toast.makeText(ContextMenu_List.this, "选择的剪切操作", ).show();
break; default:
break;
}
return super.onContextItemSelected(item); } }

ContextMenu_List.java

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <ListView
android:id="@+id/listView1"
android:entries="@array/list" android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView> </LinearLayout>

donghua_layout.xml

 <?xml version="1.0" encoding="utf-8"?>
<resources> <string-array name = "list">
<item>山东大学</item>
<item>山东科技大学</item>
<item>山东理工大学</item>
<item>山东建筑大学</item>
<item>山东农业大学</item>
<item>济南大学</item>
<item>烟台大学</item>
<item>鲁东大学</item>
<item>临沂大学</item>
<item>聊城大学</item>
</string-array>
</resources>

arrays.xml

效果图:

安卓开发_浅谈ContextMenu(上下文菜单)