2014-12-10 3 views
2

내가 컨텍스트 메뉴를 실행 텍스트 뷰를 클릭 트리거하는 텍스트 뷰에 컨텍스트 메뉴를 엽니 다 눌러.안드로이드는 긴 또한 자동 링크는

이제 TextView의 내용을 URL로 설정하고 URL을 길게 누르면 컨텍스트 메뉴가 먼저 표시되지만 손가락을 들어 올리면 링크가 눌러져 브라우저가 열립니다.

링크를 클릭하지 않도록 컨텍스트 메뉴를 사용하거나 길게 누르는 방식으로 터치 이벤트를 사용합니까? Textview가 ACTION_UP 이벤트를 처리 할 수 ​​있도록 onTouch()을 재정의하는 것으로 생각했지만 터치 이벤트를 차단하기 위해 컨텍스트 메뉴가 표시 될 때이를 신뢰할 수있게 추적 할 수는 없습니다.

답변

2

이것은 나에게 다소 해킹 된 것처럼 보이지만 View의 터치 이벤트를 직접 처리하지 않고도이 작업을 수행 할 수있는 유일한 방법입니다 (적절한 방법 일 수 있습니다).

문맥 메뉴가 열리면 본질적으로 TextView의 LinkMovementMethod이 변경되므로 위로 동작으로 링크가 실행되지 않습니다. 상황에 맞는 메뉴가 닫히면 LinkMovementMethod을 복원하여 링크의 정상 클릭이 예상대로 작동하도록합니다. 다음과 같이

onCreateContextMenu() 방법을 조정합니다

textView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() { 
     @Override 
     public void onCreateContextMenu(ContextMenu menu, 
             View view, 
             ContextMenu.ContextMenuInfo info) { 
      textView.setMovementMethod(ArrowKeyMovementMethod.getInstance()); 
      // Do stuff 
     } 
    }); 

는 그런 활동의 onContextMenuClosed()과 같이 오버라이드 (override) :

물론
@Override 
public void onContextMenuClosed(Menu menu) 
{ 
    textView.setMovementMethod(LinkMovementMethod.getInstance()); 
} 

,이 textView이 활동의 ​​클래스 멤버 있다고 가정합니다.

+0

불행히도,이 경우'textView'는 활동에서 몇 가지 추상화 계층의 사용자 정의보기의 구성원입니다. 상위 액티비티를 사용하여보기를 알리는 것은 지저분한 일이므로 가장 좋은 방법은 'GestureDetector'또는 'OnLongClickListener'를 통해 터치 이벤트를 직접 가로 채고 다른 유형의 터치 이벤트가 발생할 때까지 플래그를 통해 ACTION_UP 이벤트를 사용하지 않도록 설정하는 것입니다. – allenc

+0

@allenc 그래, 터치 이벤트를 처리하는 것은 확실한 해결책 일 것입니다. 나는 당신이 당신의 질문을 피하고 싶다고 말한 것을 읽었을 것입니다. –

0

Mike M.이 말한 것처럼.

대신 setOnCreateContextMenuListener를 사용할 수 있습니다. 이 방법 클릭 부모의 뷰를 수행

예 : 여기

는 뷰 그룹 내부의 텍스트 뷰입니다;

textview.setOnCreateContextMenuListener(
(menu, v, menuInfo) -> viewgroup.performLongClick());