Skip to content Skip to sidebar Skip to footer

Make Ellipsized A Textview Which Has Linkmovementmethod

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 ellipsiz

Solution 1:

I found solution! Instead setMovementMethod() use OnTouchListener.

Stringtext= textView.getText().toString();
SpannableStringspanText=newSpannableString(text);

//here set your spans to spanText

textView.setOnTouchListener(newTouchTextView(spanText));
textView.setText(spanText);

I got this onTouchEvent() from LinkMovementMethod class.

staticclassTouchTextViewimplementsView.OnTouchListener {
    Spannable spannable;

    publicTouchTextView(Spannable spannable){
        this.spannable = spannable;
    }
    @OverridepublicbooleanonTouch(View v, MotionEvent event) {
        intaction= event.getAction();
        if(!(v instanceof TextView)){
            returnfalse;
        }
        TextViewtextView= (TextView) v;
        if (action == MotionEvent.ACTION_UP ||
                action == MotionEvent.ACTION_DOWN) {
            intx= (int) event.getX();
            inty= (int) event.getY();

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

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

            Layoutlayout= textView.getLayout();
            intline= layout.getLineForVertical(y);
            intoff= 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);
                } elseif (action == MotionEvent.ACTION_DOWN) {
                    Selection.setSelection(spannable,
                            spannable.getSpanStart(link[0]),
                            spannable.getSpanEnd(link[0]));
                }

                returntrue;
            } else {
                Selection.removeSelection(spannable);
            }
        }

        returnfalse;
    }
}

And sure TextView should have this attributes:

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

Solution 2:

I needed something slightly more flexible than the great solution by @Airfreshener. Hopefully it helps someone else.

Should be able to drop and replace instances of TextView with ClickableSpanTextView. You may need to add additional constructors to ClickableSpanTextView depending on your needs.

publicclassClickableSpanTextViewextendsTextView {

  staticclassSpannableClickListenerimplementsView.OnTouchListener {

    privatestatic SpannableClickListener defaultInstance;

    publicstatic SpannableClickListener defaultInstance() {
      if (defaultInstance == null) {
        defaultInstance = newSpannableClickListener();
      }
      return defaultInstance;
    }

    privateSpannableClickListener() {}

    @OverridepublicbooleanonTouch(View view, MotionEvent event) {
      if (!(view instanceof TextView)) {
        returnfalse;
      }
      TextViewtextView= (TextView) view;

      CharSequencetext= textView.getText();
      if (!(text instanceof Spannable)) {
        returnfalse;
      }
      Spannablespannable= (Spannable) text;

      intaction= event.getAction();
      if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) {
        intx= (int) event.getX();
        inty= (int) event.getY();

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

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

        android.text.Layoutlayout= textView.getLayout();
        intline= layout.getLineForVertical(y);
        intoff= 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);
          } elseif (action == MotionEvent.ACTION_DOWN) {
            Selection.setSelection(
                spannable, spannable.getSpanStart(link[0]), spannable.getSpanEnd(link[0]));
          }

          returntrue;
        } else {
          Selection.removeSelection(spannable);
        }
      }

      returnfalse;
    }
  }

  staticclassCompositeOnTouchListenerimplementsView.OnTouchListener {
    OnTouchListener[] listeners;

    publicCompositeOnTouchListener(OnTouchListener... listeners) {
      this.listeners = listeners;
    }

    @OverridepublicbooleanonTouch(View view, MotionEvent event) {
      for (OnTouchListener listener : listeners) {
        // Apply each touch listener in order until one returns trueif (listener.onTouch(view, event)) {
          returntrue;
        }
      }
      returnfalse;
    }
  }

  publicClickableSpanTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    super.setOnTouchListener(SpannableClickListener.defaultInstance());
  }

  @OverridepublicvoidsetOnTouchListener(OnTouchListener listener) {
    super.setOnTouchListener(
        newCompositeOnTouchListener(SpannableClickListener.defaultInstance(), listener));
  }
}

Post a Comment for "Make Ellipsized A Textview Which Has Linkmovementmethod"