private void stripUnderlines(TextView textView) { Spannable s = new SpannableString(textView.getText()); URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class); for (URLSpan span: spans) { int start = s.getSpanStart(span); int end = s.getSpanEnd(span); s.removeSpan(span); span = new URLSpanNoUnderline(span.getURL()); s.setSpan(span, start, end, 0); } textView.setText(s); }
public static CharSequence handleTextUrl(CharSequence content) { Matcher m = URL_PATTERN.matcher(content); Spannable spannable = null; while (m.find()) { // Ensure spannable if (spannable == null) { if (content instanceof Spannable) { spannable = (Spannable) content; } else { spannable = new SpannableString(content); } } int start = m.start(); int end = m.end(); URLSpan[] links = spannable.getSpans(start, end, URLSpan.class); if (links.length > 0) { // There has been URLSpan already, leave it alone continue; } URLSpan urlSpan = new URLSpan(m.group(0)); spannable.setSpan(urlSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } return spannable == null ? content : spannable; } }
private void stripUnderlines(TextView textView) { Spannable s = new SpannableString(textView.getText()); URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class); for (URLSpan span: spans) { int start = s.getSpanStart(span); int end = s.getSpanEnd(span); s.removeSpan(span); span = new URLSpanNoUnderline(span.getURL()); s.setSpan(span, start, end, 0); } textView.setText(s); }
private void searchFor(String text) { TextView prose=(TextView)findViewById(R.id.prose); Spannable raw=new SpannableString(prose.getText()); BackgroundColorSpan[] spans=raw.getSpans(0, raw.length(), BackgroundColorSpan.class); for (BackgroundColorSpan span : spans) { raw.removeSpan(span); } int index=TextUtils.indexOf(raw, text); while (index >= 0) { raw.setSpan(new BackgroundColorSpan(0xFF8B008B), index, index + text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); index=TextUtils.indexOf(raw, text, index + text.length()); } prose.setText(raw); } }
private TouchableUrlSpan getPressedSpan(TextView textView, Spannable spannable, MotionEvent event) { 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); TouchableUrlSpan[] link = spannable.getSpans(off, off, TouchableUrlSpan.class); TouchableUrlSpan touchedSpan = null; if (link.length > 0) { touchedSpan = link[0]; } return touchedSpan; }
private void assertAlignment(Spannable spannable, Layout.Alignment alignment) { if (alignment != null) { AlignmentSpan.Standard[] alignmentSpans = spannable.getSpans(0, spannable.length(), AlignmentSpan.Standard.class); assertThat(alignmentSpans).hasLength(1); assertThat(alignmentSpans[0].getAlignment()).isEqualTo(alignment); } else { assertThat(spannable.getSpans(0, spannable.length(), AlignmentSpan.Standard.class)) .hasLength(0); } }
/** * @param context * @param spannable * @param title * @return */ public static SpannableStringBuilder getText(Activity context, Spannable spannable, String title) { if (spannable == null || spannable.length() <= 0) { Log.e(TAG, "getText spannable == null || spannable.length() <= 0 >> return new SpannableStringBuilder();"); return new SpannableStringBuilder(); } SpannableStringBuilder builder = new SpannableStringBuilder(spannable); builder.clearSpans();// should clear old spans URLSpan[] urls = spannable.getSpans(0, spannable.length(), URLSpan.class); if (urls != null) { for (URLSpan urlSpan : urls) { if (urlSpan != null) { MyURLSpan myURLSpan = new MyURLSpan(context, urlSpan.getURL(), title); builder.setSpan(myURLSpan, spannable.getSpanStart(urlSpan), spannable .getSpanEnd(urlSpan), Spannable.SPAN_EXCLUSIVE_INCLUSIVE); } } } return builder; }
private void assertForeground(Spannable spannable, int foregroundColor) { ForegroundColorSpan[] foregroundColorSpans = spannable.getSpans(0, spannable.length(), ForegroundColorSpan.class); assertThat(foregroundColorSpans[foregroundColorSpans.length - 1].getForegroundColor()) .isEqualTo(foregroundColor); }
private void assertFont(Spannable spannable, String font) { TypefaceSpan[] typefaceSpans = spannable.getSpans(0, spannable.length(), TypefaceSpan.class); assertThat(typefaceSpans[typefaceSpans.length - 1].getFamily()).isEqualTo(font); }
private void assertStyle(Spannable spannable, int fontStyle) { StyleSpan[] styleSpans = spannable.getSpans(0, spannable.length(), StyleSpan.class); assertThat(styleSpans[styleSpans.length - 1].getStyle()).isEqualTo(fontStyle); }
private void assertRelativeFontSize(Spannable spannable, float relativeFontSize) { RelativeSizeSpan[] relativeSizeSpans = spannable.getSpans(0, spannable.length(), RelativeSizeSpan.class); assertThat(relativeSizeSpans).hasLength(1); assertThat(relativeSizeSpans[0].getSizeChange()).isEqualTo(relativeFontSize); }
private void assertAbsoluteFontSize(Spannable spannable, int absoluteFontSize) { AbsoluteSizeSpan[] absoluteSizeSpans = spannable.getSpans(0, spannable.length(), AbsoluteSizeSpan.class); assertThat(absoluteSizeSpans).hasLength(1); assertThat(absoluteSizeSpans[0].getSize()).isEqualTo(absoluteFontSize); }
private void assertBackground(Spannable spannable, int backgroundColor) { BackgroundColorSpan[] backgroundColorSpans = spannable.getSpans(0, spannable.length(), BackgroundColorSpan.class); if (backgroundColor != 0) { assertThat(backgroundColorSpans[backgroundColorSpans.length - 1].getBackgroundColor()) .isEqualTo(backgroundColor); } else { assertThat(backgroundColorSpans).hasLength(0); } }
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; } });
public abstract class TextViewLinkHandler extends LinkMovementMethod { public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) { if (event.getAction() != MotionEvent.ACTION_UP) return super.onTouchEvent(widget, buffer, event); 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); URLSpan[] link = buffer.getSpans(off, off, URLSpan.class); if (link.length != 0) { onLinkClick(link[0].getURL()); } return true; } abstract public void onLinkClick(String url); }
int off = layout.getOffsetForHorizontal(line, x); ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);
private void assertUnderline(Spannable spannable, boolean isUnderline) { UnderlineSpan[] underlineSpans = spannable.getSpans(0, spannable.length(), UnderlineSpan.class); assertWithMessage(isUnderline ? "must be underlined" : "must not be underlined") .that(underlineSpans) .hasLength(isUnderline ? 1 : 0); }
private void assertStrikethrough(Spannable spannable, boolean isStrikethrough) { StrikethroughSpan[] striketroughSpans = spannable.getSpans(0, spannable.length(), StrikethroughSpan.class); assertWithMessage(isStrikethrough ? "must be strikethrough" : "must not be strikethrough") .that(striketroughSpans) .hasLength(isStrikethrough ? 1 : 0); }
int off = layout.getOffsetForHorizontal(line, x); ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);
int off = layout.getOffsetForHorizontal(line, x); ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);