一、上下问菜单
在某个菜单项上长按,会弹出一个菜单,这个就是上下文菜单。有点类似与Windows系统中的右键菜单。
二、上下文菜单的内容
1、标题
2、图标
3、菜单项
4、对应的菜单事件
三、OptionsMenu和ContentMenu的区别:
1、OptionMenu对应的Activity,一个Activity只能拥有一个选项菜单。
2、 ContentMenu对应的View,每个View都可以设置上下文菜单。
3、一般情况下,上下文菜单常用于ListView或者GirdView。
四、如何实现ContentMenu:
1、首先给View注册上下文菜单,registerForContextMenu();
2、通过xml布局的方式添加菜单项,也可以通过代码的方式动态添加菜单项。
3、设置菜单点击后的相应事件,onContextItemSelected();
五、代码实现
main.xml:放置一个ListView用来显示列表信息
<LinearLayout 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:orientation="vertical" tools:context=".MainActivity"> <ListView android:id="@+id/lv_files" android:layout_width="match_parent" android:layout_height="match_parent"> </ListView> </LinearLayout>
menu_layout.xml,自定义的菜单项内容,可以通过菜单中getMenuInflater方法获取定义好的xml菜单。
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity"> <item android:id="@+id/menu_copy" android:orderInCategory="100" android:title="复制" app:showAsAction="never" /> <item android:id="@+id/menu_paste" android:orderInCategory="100" android:title="粘贴" app:showAsAction="never" /> <item android:id="@+id/menu_cut" android:orderInCategory="100" android:title="剪切" app:showAsAction="never" /> <item android:id="@+id/menu_rename" android:orderInCategory="100" android:title="重命名" app:showAsAction="never" /> </menu>
main.java
package com.example.zhengcheng.contextmenudemo; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.ContextMenu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; import java.util.ArrayList; import java.util.zip.Inflater; public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); LoadListView(); } ListView lv_files; private void LoadListView() { lv_files = (ListView) findViewById(R.id.lv_files); //创建一个适配器,用来填充到ListView中。 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.support_simple_spinner_dropdown_item, getArrayList()); //设置listView的适配器 lv_files.setAdapter(adapter); //为listview注册上下文菜单 this.registerForContextMenu(lv_files); } /** * 创建上下文菜单,重写onCreateContextMenu方法 */ @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); menu.setHeaderTitle("文件操作"); //设置上下问菜单的标题 menu.setHeaderIcon(R.mipmap.ic_launcher); //设置上下问菜单的图标 //动态添加菜单项 // menu.add(1,101,1,"复制"); // menu.add(1,102,1,"粘贴"); // menu.add(1,103,1,"剪切"); // menu.add(1,104,1,"删除"); // menu.add(1,105,1,"重命名"); //导入xml菜单内容 MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_layout, menu); } /** * 设置上下问菜单内容的点击事件,重写onContextItemSelected方法 */ @Override public boolean onContextItemSelected(MenuItem item) { //获取选中的ListView中的Item项 AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); //给动态生成的菜单项添加事件 // switch (item.getItemId()) { // case 101: // Toast.makeText(this, "复制", Toast.LENGTH_SHORT).show(); // break; // case 102: // Toast.makeText(this, "粘贴", Toast.LENGTH_SHORT).show(); // break; // case 103: // Toast.makeText(this, "剪切", Toast.LENGTH_SHORT).show(); // break; // case 104: // Toast.makeText(this, "删除", Toast.LENGTH_SHORT).show(); // break; // case 105: // Toast.makeText(this, "重命名", Toast.LENGTH_SHORT).show(); // break; // } //给xml菜单项生成事件 switch (item.getItemId()){ case R.id.menu_copy: //Toast.makeText(this, "xml_复制", Toast.LENGTH_SHORT).show(); Toast.makeText(this, info.toString() + "复制", Toast.LENGTH_SHORT).show(); break; case R.id.menu_cut: Toast.makeText(this, "xml_剪切", Toast.LENGTH_SHORT).show(); break; case R.id.menu_paste: Toast.makeText(this, "xml_粘贴", Toast.LENGTH_SHORT).show(); break; case R.id.menu_rename: Toast.makeText(this, "xml_重命名", Toast.LENGTH_SHORT).show(); break; } return super.onContextItemSelected(item); } /** * 获取数据,填充到ArrayAdapter的数据 * * @return */ private ArrayList<String> getArrayList() { ArrayList<String> list = new ArrayList<>(); for (int i = 1; i <= 10; i++) { list.add("文件" + i); } return list; } }