ListView里TextView使用ClickableSpan,ListView的Item无法点击的解决办法
2017-02-17 19:43
369 查看
最近遇到一个需求是ListView每一个Item里的TextView可以实现url链接点击跳转浏览器。当通过TextView设置 `setMovementMethod(new LinkMovementMethod())`,点击跳转成功,但是这个Item都无法响应点击 网上查找资料发现,是因为设置过setMovementMethod方法之后,textView自己把自己的设置改成:
setFocusable(true); setClickable(true); setLongClickable(true);
这里有一个简单的方法是:
textView.setMovementMethod(new LinkMovementMethod()); textView.setFocusable(false)
,即在setMovementMethod之后调一次`setFocusable(false)`使其失去焦点,但此方法并不能完美适用,下面是stackoverflow网站的解决方案, 使用自定义TextView和LinkMovementMethod:
public class TextViewFixTouchConsume extends TextView { boolean dontConsumeNonUrlClicks = true; boolean linkHit; public TextViewFixTouchConsume(Context context) { super(context); } public TextViewFixTouchConsume(Context context, AttributeSet attrs) { super(context, attrs); } public TextViewFixTouchConsume( Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onTouchEvent(MotionEvent event) { linkHit = false; boolean res = super.onTouchEvent(event); if (dontConsumeNonUrlClicks) return linkHit; return res; } public void setTextViewHTML(String html) { CharSequence sequence = Html.fromHtml(html); SpannableStringBuilder strBuilder = new SpannableStringBuilder(sequence); setText(strBuilder); } @Override public boolean hasFocusable() { return false; } public static class LocalLinkMovementMethod extends LinkMovementMethod{ static LocalLinkMovementMethod sInstance; public static LocalLinkMovementMethod getInstance() { if (sInstance == null) sInstance = new LocalLinkMovementMethod(); return sInstance; } @Override public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) { 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(); Layout layout = widget.getLayout(); int line = layout.getLineForVertical(y); int off = layout.getOffsetForHorizontal(line, x); 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])); } if (widget instanceof TextViewFixTouchConsume){ ((TextViewFixTouchConsume) widget).linkHit = true; } return true; } else { Selection.removeSelection(buffer); Touch.onTouchEvent(widget, buffer, event); return false; } } return Touch.onTouchEvent(widget, buffer, event); } } }
然后在代码中合适的位置调用:
textView.setMovementMethod( TextViewFixTouchConsume.LocalLinkMovementMethod.getInstance() );
参考链接:
[1]http://stackoverflow.com/questions/8558732/listview-textview-with-linkmovementmethod-makes-list-item-unclickable;
[2]http://www.eoeandroid.com/thread-275209-1-1.html;
4000
相关文章推荐
- 今天使用PullToRefreshListView时遇到Item点击事件失效问题,特此记下解决办法
- ListView item的点击冲突解决办法
- Android开发:ListView系列之item点击事件的实现及点击事件失效的解决办法
- ios开发之升级到Xcode7之后插件无法使用与不小心点击Skipbundle的解决办法
- ListView Item点击失效的原因及解决办法
- iOS开发----Xcode7升级之后插件无法使用与不小心点击Skipbundle的解决办法
- Android listview 的 item 点击无效(无法获取焦点)的解决方法
- Android自定义ListView的Item无法响应OnItemClick的解决办法
- Android—ListView点击某一项item无反应解决办法
- ListView点击单个Item失效问题解决办法
- ListView中嵌套ScrollView,ScrollView拦截ListView的Item点击事件的解决办法
- ListView中item点击事件失效的解决办法
- iOS开发----Xcode7升级之后插件无法使用与不小心点击Skipbundle的解决办法
- 解决listview 嵌套HorizontalScrollView 导致item无法点击
- Listview、RecyclerView中的item中包含可以点击的控件,点击冲突解决办法
- android 自定义TextView支持微博功能后在ListView占用了Item点击的解决办法
- Android 解决 ListView的item中嵌套ScrollView,ScrollView拦截ListView的Item点击事件的解决办法
- iOS开发----Xcode7升级之后插件无法使用与不小心点击Skipbundle的解决办法
- Android ListView的item点击失效解决办法
- Mybatis 中sql 使用in(#{item})无法查询解决办法