2013-03-07 97 views
0

我有OnGestureListener在我的ListView,因为我需要手势,但现在ContextMenu将无法​​正常工作。OnGestureListener取消创建上下文菜单

编辑的代码:

我有这样的onActivityCreated方法在我的FragmentListView

gestureDetector = new GestureDetector(getActivity(), 
      new GestureListener()); 
    View.OnTouchListener gestureListener = new View.OnTouchListener() { 
     public boolean onTouch(View v, MotionEvent event) { 
      return gestureDetector.onTouchEvent(event); 
     } 
    }; 
    listView.setOnTouchListener(gestureListener); 

这样做让我的手势,但注释掉它带回我的ConextMenu。

我知道我可以使用showContextMenu(v),但不知道把它放在哪里,如果这是答案(我曾尝试在几个地方)。

在我的片段,其中适配器设置,我有这个空方法,

public void onLongPress(MotionEvent e) { 

    return; 
} 

我试图把这些代码在那里,但有一个视图没有提及。所以不知道如何继续?

+0

为什么你不能简单地使用'holder.l1'作为视图(我猜这是'ContextMenu'应该打开的视图)? – Luksprog 2013-03-07 19:18:33

+0

你的意思是在'onTouch'方法内部调用类似......'holder.l1.openconextmenu(v)'的内容?另外,视图'l1'是一个'LinearLayout',因此不起作用。它是封装ListView每一行的布局。 (我尝试设置手势到实际的'ListView'在片段中,并没有工作。) – KickingLettuce 2013-03-07 19:44:38

+1

您需要一个活动引用来调用该方法,像这样'yourActivityReference.openContextMenu(holder.l1);'。 – Luksprog 2013-03-07 19:50:21

回答

1

你仍然可以使用GestureDetector“看到”扫视姿势,也有ContextMenu打开时的ListView长击使用下面的代码在onLongPress()回调:

@Override 
public void onLongPress(MotionEvent e) { 
    registerForContextMenu(listView); 
    final int x = (int) e.getX(); 
    final int y = (int) e.getY(); 
    int position = listView.pointToPosition(x, y); 
    final int firstVisible = listView.getFirstVisiblePosition(); 
    View v = listView.getChildAt(position - firstVisible); 
    getActivity().openContextMenu(v); 
} 

一个完整Fragment类的例子can be found here

+0

再次感谢。你的代表有26.4k的原因。 – KickingLettuce 2013-03-08 18:30:19

+0

唯一的问题我发现,如果我长按空的列表视图或列表视图标题,它会得到空......似乎我需要一个空检查这里'getActivity()。openContextMenu(v);'或什么说'如果不一个实际的行,不要打开' – KickingLettuce 2013-03-09 15:27:41

+0

@KickingLettuce如果touch事件不与一行相交,'pointToPosition()'方法将返回'INVALID_POSITION',所以你知道何时不打开'ContextMenu'。 – Luksprog 2013-03-09 15:33:19