Android 种TextView 中 使用了 ClickableSpan 并设置了 maxLines 引发的问题

    科技2025-01-31  30

    问题

    项目中,列表的 TextView 使用了 ClickableSpan ,然后根据需求,限制到了2行,正常情况下是没有问题的,但是在实际环境中,有用户使用了换行符,然后点击的时候,内容滑动上去了,然后由于 RecyclerView 复用的原因,造成下面某个 item 的 TextView出现空白。

    原因

    因为要使 ClickableSpan 的 click 事件生效必须设置了 MovementMethod,内部使用了LinkMovementMethod实例,这样就产生了问题。

    解决办法

    目前我采用了一种有效的办法。

    TextView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); TextView tv = (TextView) v; CharSequence text = tv.getText(); if (text instanceof SpannableString) { if (action == MotionEvent.ACTION_UP) { int x = (int) event.getX(); int y = (int) event.getY(); x -= tv.getTotalPaddingLeft(); y -= tv.getTotalPaddingTop(); x += tv.getScrollX(); y += tv.getScrollY(); Layout layout = tv.getLayout(); int line = layout.getLineForVertical(y); int off = layout.getOffsetForHorizontal(line, x); ClickableSpan[] link = ((SpannableString)text).getSpans(off, off, ClickableSpan.class); if (link.length != 0) { link[0].onClick(tv); } else { //do textview click event return false; } } } return true; }
    Processed: 0.010, SQL: 8