Android 菜單(ContextMenu)
?
Android 的ContextMenu,即上下文菜單。(類似電腦上的鼠標右鍵功能,選中某個元素,然后點右鍵,在彈出菜單上執行操作。)在手機上,通過長時間按住界面上的元素,就會出現事先設計好的上下文菜單。
?
主要用到的方法有:
// 創建顯示上下文菜單
setOnCreateContextMenuListener
//監聽長按事件
setOnItemLongClickListener
//監聽普通按鍵事件
setOnItemClickListener
//上下文菜單的選中事件
onContextItemSelected
//監聽上下文菜單關閉事件
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個ListView
private ListView listView = null;
//定義ListView需要顯示的數據
private ArrayList<ArrayList<Object>> viewInfos = null;
//定義上下文菜單
final private static int CONTEXT_MENU_EDIT = 0;//菜單[編輯]的編號
final private static int CONTEXT_MENU_SHARE = 1;//菜單[分享]的編號
final private static int CONTEXT_MENU_DELETE = 2;//菜單[刪除]的編號
final private static int CONTEXT_MENU_CANCEL = 3;//菜單[取消]的編號
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);
//初始化要顯示的內容
initListViewInfos();
//顯示ListView
showListView();
//顯示ListView的上下文菜單
showListViewContextMenu();
}
/**
* 初始化ListView需要顯示的內容.
*/
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顯示內容中刪除1條記錄.
*/
public void removeItem(int index){
viewInfos.get(0).remove(index);
}
/**
* 從ListView顯示內容中讀取1條記錄
* @param index
* @return
*/
public Object readItem(int index){
return viewInfos.get(0).get(index);
}
/**
* 讀取當前執行的菜單
* @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參數
int[] to = {R.id.main_list_view_item_item_text};
int resource = R.layout.main_list_view_item;
//生成適配器:使用自定義工具類 SimpleAdapterUtil.java來生成適配器
SimpleAdapter simpleAdapter = SimpleAdapterUtil.create(context,viewInfos,resource,to);
listView = (ListView)findViewById(R.id.main_list_view_listview);
listView.setAdapter(simpleAdapter);
}
/**
* 顯示ListView的上下文菜單
*/
public void showListViewContextMenu(){
//創建上下文菜單
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());
}
}
});
//監聽列表項目的長按事件
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()+"]被長時間點擊了.",Toast.LENGTH_SHORT).show();
return false;
}
});
//監聽列表項目的普通點擊事件
listView.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(context,"item["+position+":"+readItem(position).toString()+"]被點擊了.",Toast.LENGTH_SHORT).show();
}
});
}
@Override
public boolean onContextItemSelected(MenuItem item) {//執行上下文菜單中的菜單
int itemId = item.getItemId();
Toast.makeText(context,"Context menu item["+itemId+":"+readContextMenu(itemId)+"] is Selected.",Toast.LENGTH_SHORT).show();
if(CONTEXT_MENU_DELETE==itemId){//刪除
//當前選中的ListView中的item編號
int index = itemLongClickSelected;
//在當前ListView中刪除選中的元素
removeItem(index);
//重新顯示ListView
showListView();
}
return super.onContextItemSelected(item);
}
@Override
public void onContextMenuClosed(Menu menu) {//關閉上下文菜單
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, "取消"),
};
參考 關于菜單基礎屬性的實體類
?
SimpleAdapter simpleAdapter = SimpleAdapterUtil.create(context,viewInfos,resource,to);
參考 1個簡單的SimpleAdapter工具類-SimpleAdapterUtil(版本二:數據格式為ArrayList<ArrayList<Object>>)
?
?
?
關于根據上下文菜單來獲取當前選中的GridView(或ListView等)的元素
?
//OnCreateContextMenuListener
gridPhoneBook.setOnCreateContextMenuListener(new OnCreateContextMenuListener(){
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
//獲取上下文菜單點擊的GridView中的元素
AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
int position = info.position;
//設置上下文菜單的標題
PhoneBook phoneBook = (PhoneBook)phoneBookAdapter.getItem(position);
menu.setHeaderTitle(phoneBook.getName());
//設置上下文菜單
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());
}
}
});
/**
* 上下文菜單-具體菜單的執行操作.
*/
@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);
}
?
?
?
?
?
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

