Android的 – ListView不会收到OnItemClick与可点击的链接的文本

我有一个ListView,除了其他视图之外,每行都包含一个TextView。 TextView呈现可能包含链接的html内容。

下面的代码出现在列表适配器中。 m_textview.setMovementMethod(LinkMovementMethod.getInstance()); m_textview.setText(Html.fromHtml(myhtmlcontent));

这会导致listview不再接收点击事件。 我决定把这个列表上的onclick代码放在适配器返回的视图上。 这并不像预期的那样工作。 现在,我可以启动另一个活动,当我点击行中的任何地方,除了textview。 我希望用户能够点击textview的非链接部分并启动另一个活动。

如果我将onclick移动到textview而不是它的父视图,它可以工作,但现在点击链接触发两个事件 – 一个用于点击链接,另一个用于textview(这不是所期望的)。

我注意到,谷歌+和窥视安卓工作在我想要的方式。 我不确定如何实现。

Solutions Collecting From Web of "Android的 – ListView不会收到OnItemClick与可点击的链接的文本"

这实际上是一个BUG 。 要解决这个问题,你可以在你的ListView's行布局xml中添加android:descendantFocusability="blocksDescendants" 。 例如

 <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项目中的可聚焦视图将禁用selectListView项目的能力。 将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); } }