2013-03-07 7 views
0

제스처가 필요하기 때문에 이 내 ListView에 있지만 지금은 ContextMenu이 작동하지 않습니다.onCreateContextMenu를 취소하는 OnGestureListener

편집 코드 : 그것을 주석

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); 
이 내 제스처를 허용 하

하지만, 다시 제공 :

ListView에 대한 Fragment은의 onActivityCreated 방법 안에이 있습니다 내 ConextMenu.

showContextMenu (v)를 사용할 수는 있지만 그 위치가 확실하지 않을 수 있습니다. (몇 군데에서 시도했습니다). 어댑터가 설정되어 내 조각 내부

,이 비어있는 방법은

public void onLongPress(MotionEvent e) { 

    return; 
} 

내가 거기에 그 코드를 넣어 시도했지만 뷰에 대한 참조가 없기 있습니다. 계속 진행하는 방법을 모르십니까?

+0

단순히'holder.l1'을 뷰로 사용할 수없는 이유는 무엇입니까 (ContextMenu가 열리는 뷰입니까?). – Luksprog

+0

당신은'onTouch' 메쏘드 안에서 ... holder.l1.openconextmenu (v)'와 같은 것을 호출 할까? 또한'l1' 뷰는'LinearLayout'이므로 작동하지 않습니다. 그것은'ListView'의 각 행을 캡슐화하는 레이아웃입니다. (조각의 실제'ListView'에 제스처를 설정하려고 시도했지만 작동하지 않습니다.) – KickingLettuce

+1

이 메소드를 호출하기 위해서는 액티비티 참조가 필요합니다 (이 경우는 'yourActivityReference.openContextMenu (holder.l1);'). – Luksprog

답변

1

당신은 여전히 ​​날뛰는 제스처 "를 참조하십시오"로 GestureDetector을 사용하고 또한 ContextMenu 열 가질 수 때 onLongPress() 콜백에 아래의 코드를 사용하여 ListView에 긴 클릭 :

@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

+0

빈 보고서 뷰 또는 목록 뷰 헤더를 길게 누르면 null이됩니다 ... getActivity(). openContextMenu (v); 또는 null 인 경우 '그렇지 않다면 null 확인이 필요합니다. 실제 행을 열지 마십시오. ' – KickingLettuce

+0

@KickingLettuce touch 이벤트가 행과 교차하지 않으면'ContextMenu'를 열지 않을 때를 알 수 있도록'pointToPosition()'메소드는'INVALID_POSITION'를 리턴합니다. – Luksprog