Android——长按弹出菜单、获取当前所按的item的信息

ListView 中有多个选项,长按每个选项,都能弹出一个上下文菜单,并能获取所按选项的详细信息。

关键步骤:

private static final int DELETE_ID = Menu.FIRST + 1;//使用Menu.FIRST常量而不使用其他常量的原因:程序封装的变量 用起来不占内存 程序读的快 不容易出错
 private static final int EDIT_ID=Menu.FIRST + 2;
 private static final int VIEW_ID=Menu.FIRST + 3;

1、在方法onCreate中为ListView注册上下文菜单(红字所示)

public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.diary_list);
  mDbHelper = new DiaryDbAdapter(this);
  mDbHelper.open();
  renderListView();
  registerForContextMenu(getListView());//为每个项创建上下文菜单
 }

2、@Override                  //创建长按弹出式菜单,这是一个回调函数
 public void onCreateContextMenu(ContextMenu menu, View v,
   ContextMenuInfo menuInfo) {
  // TODO Auto-generated method stub
        super.onCreateContextMenu(menu, v, menuInfo);
     //添加菜单项
         menu.add(0, DELETE_ID, 1, R.string.menu_delete);                       
        menu.add(0, EDIT_ID, 2, R.string.menu_edit);
        menu.add(0, VIEW_ID, 3, R.string.menu_view);
 }

对菜单中的各项的响应:

public boolean onContextItemSelected(MenuItem item) {
     AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 
     long id=info.id;//当前项的key标示,独一无二的
     int position=info.position;//当前项在ListView中的位置
   Cursor c = mDiaryCursor;
   c.moveToPosition(position);
   selected_id=id;
   selected_title=c.getString(c.getColumnIndex(DiaryDbAdapter.KEY_TITLE));
   selected_body=c.getString(c.getColumnIndex(DiaryDbAdapter.KEY_BODY));
   selected_created=c.getString(c.getColumnIndex(DiaryDbAdapter.KEY_CREATED));
         switch(item.getItemId()){

case DELETE_ID:
          mDbHelper.deleteDiary(info.id);
    renderListView();
    return true;
         case EDIT_ID:

Intent i = new Intent(ActivityMain.this, ActivityDiaryEdit.class);
       i.putExtra(DiaryDbAdapter.KEY_ROWID, selected_id);
       i.putExtra(DiaryDbAdapter.KEY_TITLE, selected_title);
       i.putExtra(DiaryDbAdapter.KEY_BODY, selected_body);//从零开始返回指定列名称,如果不存在将抛出IllegalArgumentException 异常。
       startActivityForResult(i, ACTIVITY_EDIT);
       return true;
          
         case VIEW_ID:

AlertDialog.Builder builder=new AlertDialog.Builder(ActivityMain.this);
    builder.setTitle(selected_title+"("+selected_created+")");
    builder.setMessage(selected_body);
    builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
     @Override
     public void onClick(DialogInterface dialog, int which) {
      // TODO Auto-generated method stub
      dialog.dismiss();
     }
    });
    builder.show();
    return true;
         }
         return super.onContextItemSelected(item);

}

或者(转自http://wen66.iteye.com/blog/1208617

private ListView fileList;

  • fileList.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
  • @Override
  • public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo info) {
  • // TODO Auto-generated method stub
  • menu.setHeaderTitle(R.string.contentMenu);
  • menu.add(0, AndBoxConstant.OPEN, 0, R.string.open);
  • menu.add(0, AndBoxConstant.PROPERTIY, 6, R.string.properties);
  • }
  • });
  • @Override
  • public boolean onContextItemSelected(MenuItem item) {
  • switch (item.getItemId()) {
  • case AndBoxConstant.OPEN:
  • .........
  • break;
  • case AndBoxConstant.PROPERTIY:
  • .........
  • break;
  • default:
  • break;
  • }
  • return super.onContextItemSelected(item);
  • }
  • fileList.setOnItemLongClickListener(new OnItemLongClickListener() {
  • @Override
  • public boolean onItemLongClick(AdapterView<?> ada, View view, int index, long longIndex) {
  • fileList.showContextMenu();
  • return true;
  • }
  • });

在处理长按时,注意的细节是把onItemLongClick返回设置为true,否则长按是会执行setOnItemClickListener。

=============================================================

上下文菜单Context Menu Android的上下文菜单在概念上和PC软件的右键菜单类似。当一个视图注册到一个上下文菜单时,执行一个在该对象上的“长按”(按住不动差不多两秒钟)动作,将出现一个提供相关功能的浮动菜单。上下文菜单可以被注册到任何视图对象中,不过,最常见的是用于列表视图ListView的item,在按中列表项时,会转换其背景色而提示将呈现上下文菜单。 (电话联系人列表提供了关于这个特性的一个很好的例子)。      注意:上下文菜单项不支持图标或快捷键。      为了创建一个上下文菜单,你必须重写这个活动的上下文菜单回调函数:onCreateContextMenu() 和onContextItemSelected()。在回调函数onCreateContextMenu()里,你可以通过使用一个add()方法来添加菜单项,或者通过扩充一个定义在XML中的菜单资源。然后,通过registerForContextMenu()为这个视图注册一个上下文菜单ContextMenu.  
比如,下面的代码可以被用到Notepad应用程序中来为列表中的每一个注释添加一个上下文菜单:

Java代码

  1. public void onCreateContextMenu(ContextMenu menu, View v,
  2. ContextMenuInfo menuInfo) {
  3. super.onCreateContextMenu(menu, v, menuInfo);
  4. menu.add(0, EDIT_ID, 0, "Edit");
  5. menu.add(0, DELETE_ID, 0,  "Delete");
  6. }
  7. public boolean onContextItemSelected(MenuItem item) {
  8. AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
  9. switch (item.getItemId()) {
  10. case EDIT_ID:
  11. editNote(info.id);
  12. return true;
  13. case DELETE_ID:
  14. deleteNote(info.id);
  15. return true;
  16. default:
  17. return super.onContextItemSelected(item);
  18. }
  19. }
public void onCreateContextMenu(ContextMenu menu, View v,
                                ContextMenuInfo menuInfo) {  

  super.onCreateContextMenu(menu, v, menuInfo);
  menu.add(0, EDIT_ID, 0, "Edit");
  menu.add(0, DELETE_ID, 0,  "Delete");  

}  

public boolean onContextItemSelected(MenuItem item) {  

  AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
  switch (item.getItemId()) {  

  case EDIT_ID:
    editNote(info.id);
    return true;  

  case DELETE_ID:
    deleteNote(info.id);
    return true;  

  default:
    return super.onContextItemSelected(item);
  }
}

在onCreateContextMenu()中,除了给出将添加MenuItems的ContextMenu外,还需要给定选中的视图和一个上下文菜单信息ContextMenuInfo对象,该对象提供了选中对象的附加信息。在本例中,onCreateContextMenu()没做什么特别的事-只是添加了一些菜单项。
在onContextItemSelected() 回调函数中,我们从MenuItem中请求AdapterContextMenuInfo,该对象提供当前选中项的信息。我们从中所要的只是这个选中项的列表ID,所以无论编辑还是删除一个注释,我们通过这个对象的AdapterContextMenuInfo.info字段来找到该ID。这个ID被传递给editNote() 和deleteNote()方法来执行相应的动作。  
现在,要为一个列表视图中的所有项注册上下文菜单,我们可以传递整个的列表视图对象给registerForContextMenu(View) 方法:

Java代码  

  1. registerForContextMenu(getListView());
registerForContextMenu(getListView());

记住,你可以传递任何视图对象来注册一个上下文菜单。这里,getListView()返回这个被用于Notepad应用程序的列表活动ListActivity中的列表视图对象。这样,这个列表中的任何item都被注册到这个上下文菜单。

Android——长按弹出菜单、获取当前所按的item的信息

时间: 2024-10-11 03:42:44

Android——长按弹出菜单、获取当前所按的item的信息的相关文章

Android ListView两种长按弹出菜单方式

* 知识点1:ListView item:两种长按弹出菜单方式* 知识点2:ListView SimpleAdapter的使用*  知识点 3:在java代码中创建一个ListView*/ -----------------------------------------------------Activity[mw_shl_code=java,true]package org.gxl.com; public class ListOnLongClickActivity extends Activ

【转】android创建Popwindow弹出菜单的两种方式

方法一的Activity [java] view plaincopy package com.app.test02; import android.app.Activity; import android.os.Bundle; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import

UIWebView长按弹出菜单显示英文解决办法

UIWebView加载网页后,长按弹出菜单,显示如下英文菜单样式: 在Info.plist中添加CFBundleLocalizations字段,并增加zh_CN元素,即可将上述菜单显示为中文. UIWebView长按弹出菜单显示英文解决办法

运用安卓CreateOptionsMenu和onCreateContextMenu菜单,模拟微信聊天界面长按弹出菜单选项。

1 package com.lixu.menu2; 2 3 import java.util.ArrayList; 4 5 import android.app.Activity; 6 import android.os.Bundle; 7 import android.view.ContextMenu; 8 import android.view.Menu; 9 import android.view.MenuItem; 10 import android.view.View; 11 impo

Android开发技巧——使用PopupWindow实现弹出菜单

在本文当中,我将会与大家分享一个封装了PopupWindow实现弹出菜单的类,并说明它的实现与使用. 因对界面的需求,android原生的弹出菜单已不能满足我们的需求,自定义菜单成了我们的唯一选择,在本文当中,我将与大家分享如何使用PopupWindow实现弹出菜单. 1.弹出菜单的封装PopMenu PopupWindow可以说是一个浮动在Activity之上的容器,通常用来显示自定义的视图.比如像自动完成输入框AutoCompleteTextView,它的提示列表就是使用PopupWindo

Android学习----------长按列表项弹出菜单,给菜单项添加事件,获取上下文

这里是先显示一个listview,长按listview的一个列表项,弹出一个菜单来,菜单有两个条目, "更新该条"和"删除该条",并且这两条都有监听事件,整体就像微信好友对话操作一样. 其中菜单项有一个获取上下文的操作:AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 这句也是用于列表项的. 具体代码如下: protected void onCreate(Bundle

Android ListView 长按列表弹出菜单

Android ListView 长按列表弹出菜单 设置长按菜单 listView.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() { @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { menu.add(0, 0, 0, "删除单号"); menu.add

Android 长按Listview 每个item底部弹出菜单

android界面中,有一个功能是点击listview的每个item,下方弹出两个菜单,可以点击进入别的界面,这个功能可以使用开源项目expandablelistview,的确是可以实现,但发现导入的代码过多,显得很臃肿,经过师傅指点,我采用的是如下方法,步骤如下: 1.新建一个listview,需要在外层套一层scrollview,不过使用scrollview会导致listview的高度只有一个item,需要使用自定义的listview,代码如下: package allone.verbank

[Android] 底部菜单布局+PopupWindows实现弹出菜单功能(初级篇)

    这篇文章主要是自己研究如何对底部菜单进行布局,并简单的实现点击不同"按钮"实现图片切换和背景切换的功能,最后通过PopupWindows实现弹出菜单,点击不同按钮能实现不同方法,相当于美图秀秀编辑图片的功能吧!它并没有涉及到Fragment碎片切换页面的功能,因为页面始终显示被处理的图片.这是我初学Android的一篇基础性文章和在线思想笔记,网上有很多更优秀的demo,不过也希望对大家有用~ 首先介绍两种方法实现底部菜单点击不同图标显示选中状态的效果. (可参考简短文章:An