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"