转:ListView:长按弹出上下文菜单(ContextMenu) registerForContextMenu(getListView())

在看别人源代码的时候发现有注册上下文菜单,于是找到这篇文章,算是自己收藏吧,copy过来并未对格式进行排版,如果感兴趣,还请到原文查看,支持原创。ps:原文链接见最下方

有两种方法实现长按弹出上下文菜单:

方法一:

1)注册上下文菜单

[java] view plaincopyprint?

  1. /**
  2. * 上下文菜单演示Demo
  3. *
  4. * @author CodingMyWorld 2011-8-27 下午03:22:39
  5. */
  6. publicclass SampleContextMenuActivity extends ListActivity { 
  7.     privatestaticfinal String TAG ="SampleContextMenuActivity"; 
  8. @Override
  9.     protectedvoid onCreate(Bundle savedInstanceState) { 
  10. super.onCreate(savedInstanceState); 
  11. // 显示列表
  12.         simpleShowList(); 
  13. // 为所有列表项注册上下文菜单
  14. this.registerForContextMenu(getListView()); 
  15.     } 
  16.     privatevoid simpleShowList() { 
  17. // list item
  18.         String[] files =new String[] { 
  19. "文件1", 
  20. "文件2", 
  21. "文件3", 
  22. "文件4"
  23.         }; 
  24. // simple array adapter
  25.         ArrayAdapter<String> adapter =new ArrayAdapter<String>( 
  26. this,  
  27.                 android.R.layout.simple_list_item_1, 
  28.                 files); 
  29. // set adapter
  30. this.setListAdapter(adapter); 
  31.         Log.v(TAG, "show simple list"); 
  32.     } 
/**
 * 上下文菜单演示Demo
 * 
 * @author CodingMyWorld 2011-8-27 下午03:22:39
 */
publicclass SampleContextMenuActivity extends ListActivity {
    privatestaticfinal String TAG ="SampleContextMenuActivity";

    @Override
    protectedvoid onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 显示列表
        simpleShowList();
        // 为所有列表项注册上下文菜单
this.registerForContextMenu(getListView());
    }

    privatevoid simpleShowList() {
        // list item
        String[] files =new String[] {
            "文件1",
            "文件2",
            "文件3",
            "文件4"
        };
        // simple array adapter
        ArrayAdapter<String> adapter =new ArrayAdapter<String>(
                this, 
                android.R.layout.simple_list_item_1,
                files);
        // set adapter
this.setListAdapter(adapter);
        Log.v(TAG, "show simple list");
    }
}

2)生成上下文菜单

在activity中重新onCreateContextMenu()方法

[java] view plaincopyprint?

  1. @Override
  2. publicvoid onCreateContextMenu(ContextMenu menu, View v, 
  3.         ContextMenuInfo menuInfo) { 
  4.     Log.v(TAG, "populate context menu"); 
  5. // set context menu title
  6.     menu.setHeaderTitle("文件操作"); 
  7. // add context menu item
  8.     menu.add(0, 1, Menu.NONE, "发送"); 
  9.     menu.add(0, 2, Menu.NONE, "标记为重要"); 
  10.     menu.add(0, 3, Menu.NONE, "重命名"); 
  11.     menu.add(0, 4, Menu.NONE, "删除"); 
@Override
publicvoid onCreateContextMenu(ContextMenu menu, View v,
        ContextMenuInfo menuInfo) {
    Log.v(TAG, "populate context menu");
    // set context menu title
    menu.setHeaderTitle("文件操作");
    // add context menu item
    menu.add(0, 1, Menu.NONE, "发送");
    menu.add(0, 2, Menu.NONE, "标记为重要");
    menu.add(0, 3, Menu.NONE, "重命名");
    menu.add(0, 4, Menu.NONE, "删除");
}

3)响应上下文菜单项

[java] view plaincopyprint?

  1. @Override
  2. publicboolean onContextItemSelected(MenuItem item) { 
  3. // 得到当前被选中的item信息
  4.     AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) item.getMenuInfo(); 
  5.     Log.v(TAG, "context item seleted ID="+ menuInfo.id); 
  6. switch(item.getItemId()) { 
  7.     case1: 
  8. // do something
  9. break; 
  10.     case2: 
  11. // do something
  12. break; 
  13.     case3: 
  14. // do something
  15. break; 
  16.     case4: 
  17. // do something
  18. break; 
  19. default: 
  20.         returnsuper.onContextItemSelected(item); 
  21.     } 
  22.     returntrue; 
@Override
publicboolean onContextItemSelected(MenuItem item) {
    // 得到当前被选中的item信息
    AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) item.getMenuInfo();
    Log.v(TAG, "context item seleted ID="+ menuInfo.id);
    
    switch(item.getItemId()) {
    case1:
        // do something
break;
    case2:
        // do something
break;
    case3:
        // do something
break;
    case4:
        // do something
break;
    default:
        returnsuper.onContextItemSelected(item);
    }
    returntrue;
}

方法二、

1)设置上下文菜单监听

[java] view plaincopyprint?

  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) { 
  3. super.onCreate(savedInstanceState); 
  4.         setContentView(R.layout.timing_sms_list_screen); 
  5.         mTimingListView = getListView(); 
  6.         mEmptyView = (LinearLayout)findViewById(R.id.timing_empty_view); 
  7. //      mTimingListView.setEmptyView(mEmptyView);
  8.         doQuery(); 
  9.         mTimingListView.setOnCreateContextMenuListener(mConvListOnCreateContextMenuListener); 
  10.     } 
@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.timing_sms_list_screen);
		mTimingListView = getListView();
		mEmptyView = (LinearLayout)findViewById(R.id.timing_empty_view);
//		mTimingListView.setEmptyView(mEmptyView);
		doQuery();
		mTimingListView.setOnCreateContextMenuListener(mConvListOnCreateContextMenuListener);
	}

2)定义上下文菜单监听器

[java] view plaincopyprint?

  1. <pre class="java" name="code">private final OnCreateContextMenuListener mConvListOnCreateContextMenuListener = new OnCreateContextMenuListener() { 
  2. @Override
  3. public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 
  4.             Toast.makeText(getApplicationContext(), "onCreateContextMenu()", 1000).show(); 
  5.             menu.add(0, MENU_DELETE, 0, R.string.ti_delete); 
  6.             menu.add(0, MENU_EDIT, 1, R.string.ti_edit); 
  7.             menu.add(0, MENU_SEND_IMMEDIATE, 2, R.string.ti_send_immediately); 
  8.         } 
  9.     };</pre><br><br> 



[java] view plaincopyprint?

  1. private final OnCreateContextMenuListener mConvListOnCreateContextMenuListener = new OnCreateContextMenuListener() { 
  2.         @Override 
  3.         public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 
  4.             Toast.makeText(getApplicationContext(), "onCreateContextMenu()", 1000).show(); 
  5.             menu.add(0, MENU_DELETE, 0, R.string.ti_delete); 
  6.             menu.add(0, MENU_EDIT, 1, R.string.ti_edit); 
  7.             menu.add(0, MENU_SEND_IMMEDIATE, 2, R.string.ti_send_immediately); 
  8.         } 
  9.     }; 
private final OnCreateContextMenuListener mConvListOnCreateContextMenuListener = new OnCreateContextMenuListener() {
		@Override
		public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
			Toast.makeText(getApplicationContext(), "onCreateContextMenu()", 1000).show();
			menu.add(0, MENU_DELETE, 0, R.string.ti_delete);
			menu.add(0, MENU_EDIT, 1, R.string.ti_edit);
			menu.add(0, MENU_SEND_IMMEDIATE, 2, R.string.ti_send_immediately);
		}
	};

3)响应上下文菜单项

[java] view plaincopyprint?

  1. @Override
  2. public boolean onContextItemSelected(MenuItem item) { 
  3.         TimingSmsDataService service = new TimingSmsDataService(getApplicationContext()); 
  4. switch (item.getItemId()) { 
  5. case MENU_DELETE: 
  6.                 AdapterContextMenuInfo info = (AdapterContextMenuInfo)item.getMenuInfo(); 
  7.                 Toast.makeText(getApplicationContext(), "id: "+info.id, 1500).show(); 
  8. //              service.deleteTimingSmsById(info.id);
  9. break; 
  10.         } 
  11. return super.onContextItemSelected(item); 
  12.     } 
@Override
	public boolean onContextItemSelected(MenuItem item) {
    	TimingSmsDataService service = new TimingSmsDataService(getApplicationContext());
    	switch (item.getItemId()) {
        	case MENU_DELETE:
        		AdapterContextMenuInfo info = (AdapterContextMenuInfo)item.getMenuInfo();
        		Toast.makeText(getApplicationContext(), "id: "+info.id, 1500).show();
//        		service.deleteTimingSmsById(info.id);
        		break;
    	}
		return super.onContextItemSelected(item);
	}

你可能感兴趣的:(转:ListView:长按弹出上下文菜单(ContextMenu) registerForContextMenu(getListView()))