Android 菜單(ContextMenu)
?
Android 的ContextMenu,即上下文菜單。(類(lèi)似電腦上的鼠標(biāo)右鍵功能,選中某個(gè)元素,然后點(diǎn)右鍵,在彈出菜單上執(zhí)行操作。)在手機(jī)上,通過(guò)長(zhǎng)時(shí)間按住界面上的元素,就會(huì)出現(xiàn)事先設(shè)計(jì)好的上下文菜單。
?
主要用到的方法有:
// 創(chuàng)建顯示上下文菜單 setOnCreateContextMenuListener //監(jiān)聽(tīng)長(zhǎng)按事件 setOnItemLongClickListener //監(jiān)聽(tīng)普通按鍵事件 setOnItemClickListener //上下文菜單的選中事件 onContextItemSelected //監(jiān)聽(tīng)上下文菜單關(guān)閉事件 onContextMenuClosed?
?
示例(ListView上下文菜單)
?
![]() ? |
![]() ? |
效果圖
?
main_list_view.xml 配置
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ListView android:id="@+id/main_list_view_listview" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout>
?
main_list_view_item.xml配置
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/RelativeLayout_Item" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingBottom="5dip" > <TextView android:id="@+id/main_list_view_item_item_text" android:layout_centerHorizontal="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20px" android:layout_gravity="center" /> </LinearLayout>
?
Activity代碼
package com.zhouzijing.android; import java.util.ArrayList; import com.zhouzijing.android.util.MenuEntity; import com.zhouzijing.android.util.SimpleAdapterUtil; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ContextMenu.ContextMenuInfo; import android.view.View.OnCreateContextMenuListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast; import android.widget.AdapterView.OnItemClickListener; public class Menu2 extends Activity { final Context context = this; //定義1個(gè)ListView private ListView listView = null; //定義ListView需要顯示的數(shù)據(jù) private ArrayList<ArrayList<Object>> viewInfos = null; //定義上下文菜單 final private static int CONTEXT_MENU_EDIT = 0;//菜單[編輯]的編號(hào) final private static int CONTEXT_MENU_SHARE = 1;//菜單[分享]的編號(hào) final private static int CONTEXT_MENU_DELETE = 2;//菜單[刪除]的編號(hào) final private static int CONTEXT_MENU_CANCEL = 3;//菜單[取消]的編號(hào) private int itemLongClickSelected = 0; private MenuEntity[] contextMenus = { new MenuEntity(0, CONTEXT_MENU_EDIT, 0, "編輯"), new MenuEntity(0, CONTEXT_MENU_SHARE, 1, "分享"), new MenuEntity(0, CONTEXT_MENU_DELETE, 2, "刪除"), new MenuEntity(0, CONTEXT_MENU_CANCEL, 3, "取消"), }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_list_view); //初始化要顯示的內(nèi)容 initListViewInfos(); //顯示ListView showListView(); //顯示ListView的上下文菜單 showListViewContextMenu(); } /** * 初始化ListView需要顯示的內(nèi)容. */ public void initListViewInfos(){ viewInfos = new ArrayList<ArrayList<Object>>(); ArrayList<Object> countrys = new ArrayList<Object>(); countrys.add("Austria"); countrys.add("China"); countrys.add("Egypt"); countrys.add("France"); countrys.add("Ireland"); countrys.add("Japan"); countrys.add("Spain"); countrys.add("United Kingdom"); countrys.add("United States"); viewInfos.add(countrys); } /** * 從ListView顯示內(nèi)容中刪除1條記錄. */ public void removeItem(int index){ viewInfos.get(0).remove(index); } /** * 從ListView顯示內(nèi)容中讀取1條記錄 * @param index * @return */ public Object readItem(int index){ return viewInfos.get(0).get(index); } /** * 讀取當(dāng)前執(zhí)行的菜單 * @param index * @return */ public CharSequence readContextMenu(int index){ for(int i=0;i<contextMenus.length;i++){ if(contextMenus[i].getItemId()==index) return contextMenus[i].getTitle(); } return ""; } /** * 顯示ListView. */ public void showListView(){ final Context context = this; //定義適配器to參數(shù) int[] to = {R.id.main_list_view_item_item_text}; int resource = R.layout.main_list_view_item; //生成適配器:使用自定義工具類(lèi) SimpleAdapterUtil.java來(lái)生成適配器 SimpleAdapter simpleAdapter = SimpleAdapterUtil.create(context,viewInfos,resource,to); listView = (ListView)findViewById(R.id.main_list_view_listview); listView.setAdapter(simpleAdapter); } /** * 顯示ListView的上下文菜單 */ public void showListViewContextMenu(){ //創(chuàng)建上下文菜單 listView.setOnCreateContextMenuListener(new OnCreateContextMenuListener(){ @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { menu.setHeaderTitle(readItem(itemLongClickSelected).toString()); MenuEntity menuEntity = null; for(int i=0;i<contextMenus.length;i++){ menuEntity = contextMenus[i]; menu.add(menuEntity.getGroupId(),menuEntity.getItemId(),menuEntity.getOrder(),menuEntity.getTitle()); } } }); //監(jiān)聽(tīng)列表項(xiàng)目的長(zhǎng)按事件 listView.setOnItemLongClickListener(new OnItemLongClickListener(){ @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { itemLongClickSelected = position; Toast.makeText(context,"item["+position+":"+readItem(itemLongClickSelected).toString()+"]被長(zhǎng)時(shí)間點(diǎn)擊了.",Toast.LENGTH_SHORT).show(); return false; } }); //監(jiān)聽(tīng)列表項(xiàng)目的普通點(diǎn)擊事件 listView.setOnItemClickListener(new OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(context,"item["+position+":"+readItem(position).toString()+"]被點(diǎn)擊了.",Toast.LENGTH_SHORT).show(); } }); } @Override public boolean onContextItemSelected(MenuItem item) {//執(zhí)行上下文菜單中的菜單 int itemId = item.getItemId(); Toast.makeText(context,"Context menu item["+itemId+":"+readContextMenu(itemId)+"] is Selected.",Toast.LENGTH_SHORT).show(); if(CONTEXT_MENU_DELETE==itemId){//刪除 //當(dāng)前選中的ListView中的item編號(hào) int index = itemLongClickSelected; //在當(dāng)前ListView中刪除選中的元素 removeItem(index); //重新顯示ListView showListView(); } return super.onContextItemSelected(item); } @Override public void onContextMenuClosed(Menu menu) {//關(guān)閉上下文菜單 Toast.makeText(context,"Context Menu is Closed.",Toast.LENGTH_SHORT).show(); super.onContextMenuClosed(menu); } }?
?
備注:
?
private MenuEntity[] contextMenus = { new MenuEntity(0, CONTEXT_MENU_EDIT, 0, "編輯"), new MenuEntity(0, CONTEXT_MENU_SHARE, 1, "分享"), new MenuEntity(0, CONTEXT_MENU_DELETE, 2, "刪除"), new MenuEntity(0, CONTEXT_MENU_CANCEL, 3, "取消"), };
參考 關(guān)于菜單基礎(chǔ)屬性的實(shí)體類(lèi)
?
SimpleAdapter simpleAdapter = SimpleAdapterUtil.create(context,viewInfos,resource,to);
?
?
?
關(guān)于根據(jù)上下文菜單來(lái)獲取當(dāng)前選中的GridView(或ListView等)的元素
?
//OnCreateContextMenuListener gridPhoneBook.setOnCreateContextMenuListener(new OnCreateContextMenuListener(){ @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { //獲取上下文菜單點(diǎn)擊的GridView中的元素 AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo; int position = info.position; //設(shè)置上下文菜單的標(biāo)題 PhoneBook phoneBook = (PhoneBook)phoneBookAdapter.getItem(position); menu.setHeaderTitle(phoneBook.getName()); //設(shè)置上下文菜單 MenuEntity menuEntity; for(int i=0;i<CONTEXT_MENUS.length;i++){ menuEntity = CONTEXT_MENUS[i]; menu.add(menuEntity.getGroupId(), menuEntity.getItemId() ,menuEntity.getOrder(),menuEntity.getTitle()); } } }); /** * 上下文菜單-具體菜單的執(zhí)行操作. */ @Override public boolean onContextItemSelected(MenuItem item) { //獲取選中的GridView的元素 AdapterContextMenuInfo info = (AdapterContextMenuInfo)item.getMenuInfo(); int position = info.position; PhoneBook phoneBook = (PhoneBook)phoneBookAdapter.getItem(position); //菜單ID int menuId = item.getItemId(); switch(menuId){ case CONTEXT_MENU_PHONE_BOOK_DELETE: doContextMenuOfDelete(phoneBook); break; } return super.onContextItemSelected(item); }?
?
?
?
?
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
