Intereting Posts
BitmapFactory.decodeFile возвращает нулевое изображение Импорт проекта android в Intellij IDEA / использование общих ресурсов Admob показывает тестовые объявления, но не реальные объявления Android terminal – telnet отсутствует команды, получая эту ошибку: KO: неизвестная команда, попробуйте 'help' Android – получить выделенную память С запросом на отмену разрешения для facebook, не вставляя дважды диалог facebook Неправильные размеры изображения в android при использовании растрового изображения AWS S3 Rest API с Android Retrofit V2 библиотека, загруженное изображение повреждено Как реализовать кеширование в приложении android для результатов REST API? Отправка данных в мой (рабочий) виджетов Не завершена работа? Насколько безопасна защита от обратной инженерии? Какое правильное действие Spotify для фильтра, воспроизводимого сейчас? Имейте TextInputLayout только показывая подсказку после ввода первого символа Как перенести каждый инстант один раз при использовании singleTask

Android – ListView не получает OnItemClick для текстового просмотра с интерактивными ссылками

У меня есть ListView, который содержит TextView в каждой строке, помимо ряда других представлений. TextView отображает содержимое html, которое может содержать ссылки.

Следующий код отображается в списке. m_textview.setMovementMethod (LinkMovementMethod.getInstance ()); m_textview.setText (Html.fromHtml (myhtmlcontent));

Это приводит к тому, что listview больше не получает события щелчка. Я решил поместить список onclick-кода в представление, которое возвращается адаптером. Это не работает по желанию. Теперь я могу запустить другое действие, когда я нажимаю в любом месте строки, кроме текстового. Я хочу, чтобы пользователи могли нажимать на не-ссылки часть текста и запускать другое действие.

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

Я заметил, что google + и подглядывать на работу в андроиде так, как я хочу. Я не знаю, как это можно добиться.

На самом деле это BUG . Чтобы решить эту проблему, вы можете добавить android:descendantFocusability="blocksDescendants" вы используете ListView's раскладки строк в ListView's xml. Например, для

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:descendantFocusability="blocksDescendants" android:orientation="vertical" > <TextView android:id="@+id/lblStatusMessage" android:layout_width="fill_parent" android:layout_height="wrap_content" android:autoLink="web" android:focusable="false" android:textSize="15sp" /> </LinearLayout> 

Источник: это и это

Удачи 🙂

Фокусируемые представления внутри элемента ListView будут отключать возможность выбора элементов ListView. Применение android:focusable="false" для TextView позволит OnItemClick снова работать. Вам также может потребоваться применить android:focusableInTouchMode="false" чтобы заставить трекбол игнорировать ссылки, потому что нажатие трекбола над фокусируемым элементом в ListView может как щелкнуть ссылку, так и элемент ListView.

Вы можете прикрепить в списке список setOnItemClickListener.

У меня была такая же проблема, и ни один из этих ответов не работал для меня. В конце концов, мне удалось устранить проблему, удалив атрибут android:inputType="textMultiLine" .

TextView, который реагирует только на события касания ссылок. На основе https://stackoverflow.com/a/7327332/1768722

  public class AutoLinkTextView extends TextView { public AutoLinkTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } public AutoLinkTextView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public AutoLinkTextView(Context context) { super(context); init(); } private void init() { this.setAutoLinkMask(Linkify.ALL); } /** * @Linkify applies to a movementMethod to the textView @LinkMovementMethod. * That movement method thought it implements a scrolling * vertically method it overrides any other scrolling method the * parent has. * * Although touchEvent can be dispached to the parent, the specific * parent ScrollView needed the whole sequence ACTION_DOWN , * ACTION_MOVE, ACTION_UP to perform (sweep detection). So the * solution to this problem is after applying @Linkify we need to * remove the textView's scrolling method and handle the @LinkMovementMethod * link detection action in onTouchEvent of the textView. */ @Override public boolean onTouchEvent(MotionEvent event) { final TextView widget = (TextView) this; final Object text = widget.getText(); if (text instanceof Spannable) { final Spannable buffer = (Spannable) text; final int action = event.getAction(); if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) { int x = (int) event.getX(); int y = (int) event.getY(); x -= widget.getTotalPaddingLeft(); y -= widget.getTotalPaddingTop(); x += widget.getScrollX(); y += widget.getScrollY(); final Layout layout = widget.getLayout(); final int line = layout.getLineForVertical(y); final int off = layout.getOffsetForHorizontal(line, x); final ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class); if (link.length != 0) { if (action == MotionEvent.ACTION_UP) { link[0].onClick(widget); } else if (action == MotionEvent.ACTION_DOWN) { Selection.setSelection(buffer, buffer.getSpanStart(link[0]), buffer.getSpanEnd(link[0])); } return true; } } } return false; } @Override public void setText(CharSequence text, BufferType type) { super.setText(text, type); this.setMovementMethod(null); } }