2013-03-07 119 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