您的位置:首页 > 其它

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Item无响应 listview
相关文章推荐