androoid framework学习之 - ContextMenu上下文菜单

来源:互联网 发布:包头稀土高新区大数据 编辑:程序博客网 时间:2024/05/16 09:11

转载自http://stephen830.iteye.com/blog/1130637


Android 菜单(ContextMenu)

 

Android 的ContextMenu,即上下文菜单。(类似电脑上的鼠标右键功能,选中某个元素,然后点右键,在弹出菜单上执行操作。)在手机上,通过长时间按住界面上的元素,就会出现事先设计好的上下文菜单。

 

主要用到的方法有:

Java代码  收藏代码
  1. // 创建显示上下文菜单  
  2. setOnCreateContextMenuListener  
  3.   
  4. //监听长按事件  
  5. setOnItemLongClickListener  
  6.   
  7. //监听普通按键事件  
  8. setOnItemClickListener  
  9.   
  10. //上下文菜单的选中事件  
  11. onContextItemSelected  
  12.   
  13. //监听上下文菜单关闭事件  
  14. onContextMenuClosed  
 

 


示例(ListView上下文菜单)

 



 

 

效果图

 

main_list_view.xml 配置

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >  
  7. <ListView  
  8.     android:id="@+id/main_list_view_listview"  
  9.     android:layout_width="fill_parent"  
  10.     android:layout_height="fill_parent"  
  11.     />  
  12. </LinearLayout>  

 

main_list_view_item.xml配置

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:id="@+id/RelativeLayout_Item"  
  4.     android:layout_width="fill_parent" android:layout_height="wrap_content"  
  5.     android:paddingBottom="5dip"  
  6.     >  
  7.     <TextView   
  8.         android:id="@+id/main_list_view_item_item_text"  
  9.         android:layout_centerHorizontal="true"   
  10.         android:layout_width="wrap_content"  
  11.         android:layout_height="wrap_content"   
  12.         android:textSize="20px"  
  13.         android:layout_gravity="center"  
  14.         />  
  15. </LinearLayout>  

 

Activity代码

Java代码  收藏代码
  1. package com.zhouzijing.android;  
  2.   
  3. import java.util.ArrayList;  
  4. import com.zhouzijing.android.util.MenuEntity;  
  5. import com.zhouzijing.android.util.SimpleAdapterUtil;  
  6. import android.app.Activity;  
  7. import android.content.Context;  
  8. import android.os.Bundle;  
  9. import android.view.ContextMenu;  
  10. import android.view.Menu;  
  11. import android.view.MenuItem;  
  12. import android.view.View;  
  13. import android.view.ContextMenu.ContextMenuInfo;  
  14. import android.view.View.OnCreateContextMenuListener;  
  15. import android.widget.AdapterView;  
  16. import android.widget.AdapterView.OnItemLongClickListener;  
  17. import android.widget.ListView;  
  18. import android.widget.SimpleAdapter;  
  19. import android.widget.Toast;  
  20. import android.widget.AdapterView.OnItemClickListener;  
  21.   
  22. public class Menu2 extends Activity {  
  23.     final Context context = this;  
  24.     //定义1个ListView  
  25.     private ListView listView = null;  
  26.     //定义ListView需要显示的数据  
  27.     private ArrayList<ArrayList<Object>> viewInfos = null;  
  28.     //定义上下文菜单  
  29.     final private static int CONTEXT_MENU_EDIT = 0;//菜单[编辑]的编号   
  30.     final private static int CONTEXT_MENU_SHARE = 1;//菜单[分享]的编号   
  31.     final private static int CONTEXT_MENU_DELETE = 2;//菜单[删除]的编号   
  32.     final private static int CONTEXT_MENU_CANCEL = 3;//菜单[取消]的编号   
  33.     private int itemLongClickSelected = 0;  
  34.     private MenuEntity[] contextMenus = {  
  35.             new MenuEntity(0, CONTEXT_MENU_EDIT, 0"编辑"),  
  36.             new MenuEntity(0, CONTEXT_MENU_SHARE, 1"分享"),  
  37.             new MenuEntity(0, CONTEXT_MENU_DELETE, 2"删除"),  
  38.             new MenuEntity(0, CONTEXT_MENU_CANCEL, 3"取消"),  
  39.             };  
  40.   
  41.     @Override  
  42.     public void onCreate(Bundle savedInstanceState) {  
  43.         super.onCreate(savedInstanceState);  
  44.         setContentView(R.layout.main_list_view);  
  45.         //初始化要显示的内容  
  46.         initListViewInfos();  
  47.         //显示ListView  
  48.         showListView();  
  49.         //显示ListView的上下文菜单  
  50.         showListViewContextMenu();  
  51.     }  
  52.       
  53.     /** 
  54.      * 初始化ListView需要显示的内容. 
  55.      */  
  56.     public void initListViewInfos(){  
  57.         viewInfos = new ArrayList<ArrayList<Object>>();  
  58.         ArrayList<Object> countrys = new ArrayList<Object>();  
  59.         countrys.add("Austria");  
  60.         countrys.add("China");  
  61.         countrys.add("Egypt");  
  62.         countrys.add("France");  
  63.         countrys.add("Ireland");  
  64.         countrys.add("Japan");  
  65.         countrys.add("Spain");  
  66.         countrys.add("United Kingdom");  
  67.         countrys.add("United States");  
  68.         viewInfos.add(countrys);  
  69.     }  
  70.       
  71.     /** 
  72.      * 从ListView显示内容中删除1条记录. 
  73.      */  
  74.     public void removeItem(int index){  
  75.         viewInfos.get(0).remove(index);  
  76.     }  
  77.     /** 
  78.      * 从ListView显示内容中读取1条记录 
  79.      * @param index 
  80.      * @return 
  81.      */  
  82.     public Object readItem(int index){  
  83.         return viewInfos.get(0).get(index);  
  84.     }  
  85.       
  86.     /** 
  87.      * 读取当前执行的菜单 
  88.      * @param index 
  89.      * @return 
  90.      */  
  91.     public CharSequence readContextMenu(int index){  
  92.         for(int i=0;i<contextMenus.length;i++){  
  93.             if(contextMenus[i].getItemId()==index) return contextMenus[i].getTitle();  
  94.         }  
  95.         return "";  
  96.     }  
  97.     /** 
  98.      * 显示ListView. 
  99.      */  
  100.     public void showListView(){  
  101.         final Context context = this;  
  102.           
  103.         //定义适配器to参数  
  104.         int[] to = {R.id.main_list_view_item_item_text};  
  105.         int resource = R.layout.main_list_view_item;  
  106.           
  107.         //生成适配器:使用自定义工具类 SimpleAdapterUtil.java来生成适配器  
  108.         SimpleAdapter simpleAdapter = SimpleAdapterUtil.create(context,viewInfos,resource,to);   
  109.           
  110.         listView = (ListView)findViewById(R.id.main_list_view_listview);  
  111.         listView.setAdapter(simpleAdapter);  
  112.     }  
  113.     /** 
  114.      * 显示ListView的上下文菜单 
  115.      */  
  116.     public void showListViewContextMenu(){  
  117.         //创建上下文菜单  
  118.         listView.setOnCreateContextMenuListener(new OnCreateContextMenuListener(){  
  119.   
  120.             @Override  
  121.             public void onCreateContextMenu(ContextMenu menu, View v,  
  122.                     ContextMenuInfo menuInfo) {  
  123.                 menu.setHeaderTitle(readItem(itemLongClickSelected).toString());  
  124.                 MenuEntity menuEntity = null;  
  125.                 for(int i=0;i<contextMenus.length;i++){  
  126.                     menuEntity = contextMenus[i];  
  127.                     menu.add(menuEntity.getGroupId(),menuEntity.getItemId(),menuEntity.getOrder(),menuEntity.getTitle());  
  128.                 }  
  129.             }  
  130.         });  
  131.           
  132.         //监听列表项目的长按事件  
  133.         listView.setOnItemLongClickListener(new OnItemLongClickListener(){  
  134.   
  135.             @Override  
  136.             public boolean onItemLongClick(AdapterView<?> parent, View view,  
  137.                     int position, long id) {  
  138.                 itemLongClickSelected = position;  
  139.                 Toast.makeText(context,"item["+position+":"+readItem(itemLongClickSelected).toString()+"]被长时间点击了.",Toast.LENGTH_SHORT).show();  
  140.                 return false;  
  141.             }  
  142.               
  143.         });  
  144.           
  145.         //监听列表项目的普通点击事件  
  146.         listView.setOnItemClickListener(new OnItemClickListener(){  
  147.   
  148.             @Override  
  149.             public void onItemClick(AdapterView<?> parent, View view,  
  150.                     int position, long id) {  
  151.                 Toast.makeText(context,"item["+position+":"+readItem(position).toString()+"]被点击了.",Toast.LENGTH_SHORT).show();  
  152.             }  
  153.         });  
  154.     }  
  155.   
  156.     @Override  
  157.     public boolean onContextItemSelected(MenuItem item) {//执行上下文菜单中的菜单  
  158.         int itemId = item.getItemId();  
  159.         Toast.makeText(context,"Context menu item["+itemId+":"+readContextMenu(itemId)+"] is Selected.",Toast.LENGTH_SHORT).show();  
  160.         if(CONTEXT_MENU_DELETE==itemId){//删除  
  161.             //当前选中的ListView中的item编号  
  162.             int index = itemLongClickSelected;  
  163.             //在当前ListView中删除选中的元素  
  164.             removeItem(index);  
  165.             //重新显示ListView  
  166.             showListView();  
  167.         }  
  168.         return super.onContextItemSelected(item);  
  169.     }  
  170.   
  171.     @Override  
  172.     public void onContextMenuClosed(Menu menu) {//关闭上下文菜单  
  173.         Toast.makeText(context,"Context Menu is Closed.",Toast.LENGTH_SHORT).show();  
  174.         super.onContextMenuClosed(menu);  
  175.     }  
  176.       
  177.       
  178. }  
 

 

备注:

 

Java代码  收藏代码
  1. private MenuEntity[] contextMenus = {  
  2.             new MenuEntity(0, CONTEXT_MENU_EDIT, 0"编辑"),  
  3.             new MenuEntity(0, CONTEXT_MENU_SHARE, 1"分享"),  
  4.             new MenuEntity(0, CONTEXT_MENU_DELETE, 2"删除"),  
  5.             new MenuEntity(0, CONTEXT_MENU_CANCEL, 3"取消"),  
  6.             };  

参考 关于菜单基础属性的实体类

 

Java代码  收藏代码
  1. SimpleAdapter simpleAdapter = SimpleAdapterUtil.create(context,viewInfos,resource,to);   

参考 1个简单的SimpleAdapter工具类-SimpleAdapterUtil(版本二:数据格式为ArrayList<ArrayList<Object>>)

 

 

 

关于根据上下文菜单来获取当前选中的GridView(或ListView等)的元素

 

Java代码  收藏代码
  1.         //OnCreateContextMenuListener  
  2.         gridPhoneBook.setOnCreateContextMenuListener(new OnCreateContextMenuListener(){  
  3.             @Override  
  4.             public void onCreateContextMenu(ContextMenu menu, View v,  
  5.                     ContextMenuInfo menuInfo) {  
  6.                 //获取上下文菜单点击的GridView中的元素  
  7.                 AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;  
  8.                 int position = info.position;  
  9.                 //设置上下文菜单的标题  
  10.                 PhoneBook phoneBook = (PhoneBook)phoneBookAdapter.getItem(position);  
  11.                 menu.setHeaderTitle(phoneBook.getName());  
  12.                 //设置上下文菜单  
  13.                 MenuEntity menuEntity;  
  14.                 for(int i=0;i<CONTEXT_MENUS.length;i++){  
  15.                     menuEntity = CONTEXT_MENUS[i];  
  16.                     menu.add(menuEntity.getGroupId(), menuEntity.getItemId()  
  17.                             ,menuEntity.getOrder(),menuEntity.getTitle());  
  18.                 }  
  19.             }  
  20.         });   
  21.       
  22.   
  23. /** 
  24.      * 上下文菜单-具体菜单的执行操作. 
  25.      */  
  26.     @Override  
  27.     public boolean onContextItemSelected(MenuItem item) {  
  28.           
  29.         //获取选中的GridView的元素  
  30.         AdapterContextMenuInfo info = (AdapterContextMenuInfo)item.getMenuInfo();  
  31.         int position = info.position;  
  32.         PhoneBook phoneBook = (PhoneBook)phoneBookAdapter.getItem(position);  
  33.         //菜单ID  
  34.         int menuId = item.getItemId();  
  35.         switch(menuId){  
  36.         case CONTEXT_MENU_PHONE_BOOK_DELETE:  
  37.             doContextMenuOfDelete(phoneBook);  
  38.             break;  
  39.         }  
  40.         return super.onContextItemSelected(item);  
  41.     }  
0 0
原创粉丝点击