ListView: TextView with LinkMovementMethod makes list item unclickable?

前端 未结 11 768
野的像风
野的像风 2020-11-29 17:33

What I want to do: A list with messages like this:

and here is the mnessage the user writes, that will wrap nicely to the next line.

11条回答
  •  甜味超标
    2020-11-29 18:08

    babay's answer is very nice. But if you don't want to subclass TextView and don't care about LinkMovementMethod features other than clicking on links you could use this approach (this is basically copying LinkMovementMethod's onTouch functionality into TextView's OnTouchListener):

            myTextView.setOnTouchListener(new OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    boolean ret = false;
                    CharSequence text = ((TextView) v).getText();
                    Spannable stext = Spannable.Factory.getInstance().newSpannable(text);
                    TextView widget = (TextView) v;
                    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 = stext.getSpans(off, off, ClickableSpan.class);
    
                        if (link.length != 0) {
                            if (action == MotionEvent.ACTION_UP) {
                                link[0].onClick(widget);
                            }
                            ret = true;
                        }
                    }
                    return ret;
                }
            });
    

    Just assign this listener to your TextView in your list adapter getView() method.

提交回复
热议问题