2014-12-10 4 views
2

У меня есть TextView, который запускает контекстное меню:Android - длинное нажатие, чтобы открыть на TextView контекстное меню также вызывает Автоссылка нажмите

textView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() { 
      @Override 
      public void onCreateContextMenu(ContextMenu contextMenu, 
              View view, 
              ContextMenu.ContextMenuInfo contextMenuInfo) { 
       // Do stuff... 
      } 
     }); 

Это TextView также имеет атрибут android:autoLink="all" набор в XML.

Теперь, если я устанавливаю содержимое TextView на URL-адрес и долгое время нажимаю на URL-адрес, сначала появляется контекстное меню, но когда я поднимаю палец, ссылка нажимается и открывается браузер.

Есть ли способ, чтобы контекстное меню или длительное нажатие потребляли событие касания, чтобы ссылка не была нажата? Я рассмотрел переопределение onTouch() для TextView для обработки событий ACTION_UP, но я не могу надежно отслеживать, когда отображается контекстное меню для блокировки события касания.

ответ

2

Это кажется мне немного взломанным, но это единственный способ, которым я смог выполнить эту работу без прямого обращения с событиями касания View (что вполне может быть правильным методом).

Мы по существу меняем TextView's 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 
public void onContextMenuClosed(Menu menu) 
{ 
    textView.setMovementMethod(LinkMovementMethod.getInstance()); 
} 

Конечно, это предполагает, что textView является членом класса вашей деятельности.

+0

К сожалению, в этом случае 'textView' является членом пользовательского представления нескольких слоев абстракции вниз от Activity. Кажется беспорядочным полагаться на родительскую активность, чтобы уведомить мнение, поэтому наилучшим способом может быть прямой перехват событий касания через «GestureDetector» или «OnLongClickListener» и отключить события ACTION_UP с помощью флага до тех пор, пока не произойдет другой тип события касания. – allenc

+0

@allenc Да, обработка сенсорных событий определенно будет более прочным решением. Наверное, я прочитал ваш вопрос, говоря, что вы хотели этого избежать. –

0

Как и Майк М. сказал.

Вы можете использовать setOnCreateContextMenuListener вместо этого. и выполнить Щелчок родителя в этом методе

Пример:

вот TextView внутри ViewGroup;

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