My app used to use a standard ListView, and registerForContextMenu(getListView()) and everything worked just fine.
I needed to change my app to accommodate nested lists so I replaced the ListView with ExpandableListView. I changed the Activity to ExpandableListActivity. I also changed my adapter to a tree adapter and implemented a custom view class to populate the list with (based on a LinearLayout viewgroup). I have been trying to track down where I screwed it up and I've found several things. The most important is that when I add a longclick listener to my custom view and return false from it, my context menu pops up and functions properly. However, I don't get the fading orange-to-white long click animation because the long click is being sucked up somewhere else until it is handled by a longclicklistener and ignored (thus being thrown back up the chain until it reaches the ExpandableListView (which is registered for context menus). I am using a TouchInterceptor model to handle certain gestures from my listview with the following implementation: public class TouchInterceptor extends ExpandableListView { ... protected MotionEvent downStart = null; public boolean onInterceptTouchEvent(MotionEvent event) { switch(event.getAction()) { case MotionEvent.ACTION_DOWN: // keep track of the starting down-event downStart = MotionEvent.obtain(event); break; case MotionEvent.ACTION_MOVE: // if moved horizontally more than slop*2, capture the event for ourselves if(downStart == null) { break; } float deltaX = event.getX() - downStart.getX(); if(Math.abs(deltaX) > ViewConfiguration.getTouchSlop() * 2) return true; break; } // otherwise let the event slip through to children return super.onInterceptTouchEvent(event); } public boolean onTouchEvent(MotionEvent event) { // check if we crossed an item if(downStart != null) { float targetWidth = this.getWidth() / 4; float deltaX = event.getX() - downStart.getX(), deltaY = event.getY() - downStart.getY(); boolean movedAcross = (Math.abs(deltaX) > targetWidth); boolean steadyHand = (Math.abs(deltaX / deltaY) > 2); if(movedAcross && steadyHand) { boolean crossRight = (deltaX > 0); // figure out which child view we crossed ListView list = (ListView)this.findViewById(android.R.id.list); int position = list.pointToPosition((int)downStart.getX(), (int)downStart.getY()); // pass crossed event to any listeners onCross(crossRight, position); downStart = null; // and return true to consume this event return true; } } return super.onTouchEvent(event); } ... } Is there something wrong with how I'm handling these events? Note: although my context menu pops up, it only does so when the long- click event is triggered, not a long OK button click. Something is screwed up here and I'm not sure how to track it down. -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en