使椭圆形的TextView具有LinkMovementMethod [英] Make ellipsized a TextView which has LinkMovementMethod

查看:51
本文介绍了使椭圆形的TextView具有LinkMovementMethod的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 TexView ,需要将其放置在最多2行中,并在其中包含可链接的文本.如果我将LinkMovementMethod设置为文本视图,则会得到一个可滚动的 TextView ,并且ellipsize将被忽略.

I have a TexView which needs to be placed in maxim 2 lines and has a linkable text in it. If I set LinkMovementMethod to the text view I get a scrollable TextView and the ellipsize is ignored.

Xml代码:

 <TextView
            android:id="@+id/text_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="4dip"
            android:clickable="true"
            android:maxLines="2"
            android:ellipsize="end"

            android:scrollHorizontally="false"
            android:scrollbars="horizontal"
            android:isScrollContainer="false"/>

这是我的活动:

public class MyActivity extends Activity {

    private TextView tv;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        tv = (TextView) findViewById(R.id.text_view);

        SpannableStringBuilder captionSpan = new SpannableStringBuilder();
        captionSpan.append("a very long text here a very long text here a very long text here a very long text here a very long text here a very long text here a very long text here a very long text here");
        captionSpan.setSpan(new CustomClickableSpan(), 1, 7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

        tv.setText(captionSpan);
        tv.setMovementMethod(LinkMovementMethod.getInstance());
    }

}


public class CustomClickableSpan extends android.text.style.ClickableSpan {

    @Override
    public void updateDrawState(TextPaint tp) {
        tp.setColor(tp.linkColor);
        tp.setUnderlineText(false);
    }

    @Override
    public void onClick(View widget) {
    }

}

如果我未设置移动方法,则一切正常.

If I do not set the movement method everything is working fine.

推荐答案

我找到了解决方案!
而是 setMovementMethod()使用 OnTouchListener .

I found solution!
Instead setMovementMethod() use OnTouchListener.

String text = textView.getText().toString();
SpannableString spanText = new SpannableString(text);

//here set your spans to spanText

textView.setOnTouchListener(new TouchTextView(spanText));
textView.setText(spanText);

我从 LinkMovementMethod 类获得了此 onTouchEvent().

static class TouchTextView implements View.OnTouchListener {
    Spannable spannable;

    public TouchTextView (Spannable spannable){
        this.spannable = spannable;
    }
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        int action = event.getAction();
        if(!(v instanceof TextView)){
            return false;
        }
        TextView textView  = (TextView) v;
        if (action == MotionEvent.ACTION_UP ||
                action == MotionEvent.ACTION_DOWN) {
            int x = (int) event.getX();
            int y = (int) event.getY();

            x -= textView.getTotalPaddingLeft();
            y -= textView.getTotalPaddingTop();

            x += textView.getScrollX();
            y += textView.getScrollY();

            Layout layout = textView.getLayout();
            int line = layout.getLineForVertical(y);
            int off = layout.getOffsetForHorizontal(line, x);

            ClickableSpan[] link = spannable.getSpans(off, off, ClickableSpan.class);

            if (link.length != 0) {
                if (action == MotionEvent.ACTION_UP) {
                    link[0].onClick(textView);
                } else if (action == MotionEvent.ACTION_DOWN) {
                    Selection.setSelection(spannable,
                            spannable.getSpanStart(link[0]),
                            spannable.getSpanEnd(link[0]));
                }

                return true;
            } else {
                Selection.removeSelection(spannable);
            }
        }

        return false;
    }
}

并确保 TextView 应该具有以下属性:

And sure TextView should have this attributes:

android:maxLines="2"
android:ellipsize="end"

这篇关于使椭圆形的TextView具有LinkMovementMethod的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆