編輯:關於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實現數據傳遞的方法。分享給大家供大家參考,具體如下:在Android開發過程中,很多人都熟悉Intent,這是個用於在多個Vi
Android線程
說明:android的線程使用。android的線程無非就是Main Thread和Worker Thread。(除了主線程Main Thread之外的其他線程都是Wor
Android App開發的自動化測試框架UI Automator使用教程
Android的自動化測試有很多框架,其中ui automator是google官方提供的黑盒UI相關的自動化測試工具,(GitHub主頁:case使用java寫,今天實
Android Studio 2.1.3 在gradle-experimental下編譯使用OpenCV
Android Studio 進行jni的編程時有個實驗性的gradle-experimental,用起來還是比較方便,不需要編寫Android.mk文件和Applica