標籤:
操作功能表ContextMenu使用案例
前言
回顧之前的應用程式,發現之前建立的選項菜單無法顯示了。按照正常邏輯來說,左圖中在“商品資訊”一欄中應該存在選項菜單,使用者可進行分享等操作,但是現在此操作莫名其妙的消失了。寫了個測試Demo,如中圖所示,一切按照邏輯顯示正常。怪就怪在項目中無法顯示,起初設想是因為Android系統版本太高問題,但是在別的手機上測試之後發現問題依舊存在。難道是因為頂部Tab標題列遮擋住了選項菜單的顯示?繼續測試,通過在別的沒有Tab標題列的頁面測試選項菜單,發現依舊無法顯示,如右圖所示。這樣問題就變得更加棘手了。難道是因為項目整體設定問題,這方面的原因很大,不過由於問題根源不明確,所以修改也存在一定的難度。
轉變思路
既然通過選項菜單無法完成操作,通過閱讀書籍得知還存在另外兩種形式的菜單:子功能表(submenu)、捷徑功能表(context menu),嘗試建立context menu解決問題。
捷徑功能表類似於電腦程式中的“右鍵菜單”,當使用者點擊介面上某個元素超過2秒後,將啟動註冊到該介面元素的捷徑功能表。捷徑功能表同樣採用浮動的顯示方式,雖然捷徑功能表的顯示方式與子功能表相同,但兩種菜單的啟動方式卻截然不同。
捷徑功能表的使用方法與選項菜單極為相似,只是重載的函數不同而已。捷徑功能表需要重載onCreatContextMenu()函數初始化功能表項目,包括添加捷徑功能表所顯示的標題、表徵圖和菜單子項等內容。
注
有關選項菜單的建立代碼,詳見博文《Android進階(二十六)MenuInflater實現菜單添加》,在此不再展示。
源碼
// 添加捷徑功能表// 1.重寫onCreateContextMenu(Menu menu)的方法,在該方法裡調用Menu對象的方法來添加功能表項目或子功能表@Overridepublic void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {MenuInflater inflater = new MenuInflater(this);// 裝填R.menu.production_info_activity_menu對應的菜單,並添加到menu中inflater.inflate(R.menu.production_info_activity_menu, menu);menu.setHeaderTitle("QuickMark");super.onCreateContextMenu(menu, v, menuInfo);} // 2.若希望應用程式能夠相應功能表項目的單擊事件,重寫Activity的onContextItemSelected(MenuItem item)方法即可@Overridepublic boolean onContextItemSelected(MenuItem item) {// 得到當前選中的MenuItem的ID,int item_id = item.getItemId();// 判斷單擊的是是哪個功能表項目,並有針對性的做出響應switch (item_id) {case R.id.PIA_menuitem_fenxiang: {Intent intent = new Intent(Intent.ACTION_SEND);//設定分享類型//intent.setType("image/*");intent.setType("text/plain");intent.putExtra(Intent.EXTRA_SUBJECT, "Share");//好戲在這裡!intent.putExtra(Intent.EXTRA_TEXT,"#我正在使用“QuickMark”購物評價分享軟體(分享自華強APP)#" + product.toString());intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(Intent.createChooser(intent, getTitle()));};break;case R.id.PIA_menuitem_shuaxin:{}}return true;}
將捷徑功能表註冊到介面中的某一控制項代碼如下:
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.production_info_activity); // 將捷徑功能表註冊到商品二維碼圖片上 LinearLayout layout = (LinearLayout) findViewById(R.id.PIA_linearLayout); registerForContextMenu(layout); .....}
其中,R.id.PIA_linearLayout為整體線性布局的ID。
效果如所示:
至此,捷徑功能表建立完畢。
注 onCreateContextMenu與onCreateOptionsMenu的區別
onCreateOptionsMenu函數僅在第一次使用菜單時被調用一次;
onCreateContextMenu函數在每次啟動都將會被調用一次。
參考文獻
1.《Android應用程式開發 第二版》
2.http://www.2cto.com/kf/201309/247051.html
美文美圖
Android進階(二十八)操作功能表ContextMenu使用案例