編輯:關於Android編程
在上一篇文章 Android 菜單簡析01(OptionsMenu) 中給大家介紹了OptionsMenu 的使用,這篇接著給大家介紹下ContextMenu 的用法。
ContextMenu 簡稱上下文菜單,通過長按事件響應,有兩種響應模式
特別注意
ContextMenu 的 動作模式 在 Android 3.0 之前的版本無法實現(動作模式需要 ActionBar支持),如果應用 SherlockActionBar 是否支持暫時沒有驗證。
先看下 動作模式 的效果圖
坑爹的 csdn 上傳不了圖片
第一張圖:長按之後的顯示效果,App 的 title 變為 ActionMode ,會看到我們的 MenuItem 只有圖標,沒有文字。
第二張圖:點擊更多之後,沒有顯示的 MenuItem ,只有文字,沒有圖標。
再看下 ContextMenu 的 浮動模式 效果圖
坑爹的 csdn 上傳不了圖片
長按 Btn ,就彈出上圖的界面,點擊 MenuItem 或者菜單之外的區域,菜單消失。
在低版本上,Android 3.0 之前,ContextMenu 的浮動效果一致,都是如上圖所示,使用方法也一樣。
現在看下如何創建 ContextMenu ,以及調用的方法。
一、動作模式
ContextMenu 的動作模式創建過程
// 給 Btn 注冊動作模式 registerForContextMenu(btnView); // 響應長按事件 btn.setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View v) { v.setSelected(true); ContextMenu.this.startActionMode(mActionMode); return true; } });
2. 實現動作模式回調接口
/** * *創建回調接口 * */ private ActionMode.Callback mActionMode = new ActionMode.Callback() { @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { // TODO Auto-generated method stub return false; } @Override public void onDestroyActionMode(ActionMode mode) { // TODO Auto-generated method stub if (mode != null) { mode = null; } } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { MenuInflater inflater = getMenuInflater(); // 添加菜單文件 inflater.inflate(R.menu.main_icon, menu); return true; } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch (item.getItemId()) { case R.id.action_share: Log.d(tag, action_share); Toast.makeText(getApplicationContext(), action_share, Toast.LENGTH_SHORT).show(); mode.finish(); break; case R.id.action_save: Log.d(tag, action_save); Toast.makeText(getApplicationContext(), action_save, Toast.LENGTH_SHORT).show(); mode.finish(); break; case R.id.action_settings: Log.d(tag, action_settings); Toast.makeText(getApplicationContext(), action_settings, Toast.LENGTH_SHORT).show(); mode.finish(); break; case R.id.action_delete: Log.d(tag, action_delete); Toast.makeText(getApplicationContext(), action_delete, Toast.LENGTH_SHORT).show(); mode.finish(); break; case R.id.action_edit: Log.d(tag, action_edit); Toast.makeText(getApplicationContext(), action_edit, Toast.LENGTH_SHORT).show(); mode.finish(); break; default: break; } return true; } };
3 .取消注冊動作模式
//取消注冊 unRegisterForContextMenu(btnView);
Menu 菜單的 XML 文件
同時 ,動作模式還可以和 ListView 和 GridView 結合
長按 ListView Item 有如下的效果
坑爹的 CSDN 上傳不了圖
具體代碼實現
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); listView.setMultiChoiceModeListener(new MultiChoiceModeListener() { @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { // TODO Auto-generated method stub return false; } @Override public void onDestroyActionMode(ActionMode mode) { // TODO Auto-generated method stub } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main_icon, menu); return true; } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch (item.getItemId()) { case R.id.action_share: Log.d(tag, action_share); // 修改title mode.setTitle(action_share); Toast.makeText(getApplicationContext(), action_share, Toast.LENGTH_SHORT).show(); mode.finish(); break; case R.id.action_save: Log.d(tag, action_save); Toast.makeText(getApplicationContext(), action_save, Toast.LENGTH_SHORT).show(); mode.finish(); break; default: break; } return true; } @Override public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { // TODO Auto-generated method stub } });
二、浮動模式
具體的代碼過程
@Override public void onCreateContextMenu(android.view.ContextMenu menu, View v, ContextMenuInfo menuInfo) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main_icon, menu); super.onCreateContextMenu(menu, v, menuInfo); } @Override public boolean onContextItemSelected(MenuItem item) { // 監聽事件只做了部分響應 switch (item.getItemId()) { case R.id.action_compass: break; case R.id.action_delete: break; default: break; } return super.onContextItemSelected(item); }
Menu 的 XML 文件與 動作模式相同
雖然 Menu 菜單有圖標,但是 ContextMenu 不支持圖標,這個官網有說明。
這樣就完成了基本的 ContextMenu 浮動模式的菜單。
與 ContextMenu 相關的其他幾個方法
/** * *打開菜單 * * */ @Override public void openContextMenu(View view) { // TODO Auto-generated method stub super.openContextMenu(view); } /** * *關閉菜單 * * */ @Override public void closeContextMenu() { // TODO Auto-generated method stub super.closeContextMenu(); } /** * *關閉菜單之後的監聽事件 * * */ @Override public void onContextMenuClosed(Menu menu) { super.onContextMenuClosed(menu); }
本文實例講述了Android利用Intent實現數據傳遞的方法。分享給大家供大家參考,具體如下:在Android開發過程中,很多人都熟悉Intent,這是個用於在多個Vi
說明:android的線程使用。android的線程無非就是Main Thread和Worker Thread。(除了主線程Main Thread之外的其他線程都是Wor
Android的自動化測試有很多框架,其中ui automator是google官方提供的黑盒UI相關的自動化測試工具,(GitHub主頁:case使用java寫,今天實
Android Studio 進行jni的編程時有個實驗性的gradle-experimental,用起來還是比較方便,不需要編寫Android.mk文件和Applica