@Override public <T> T[] getSpans(int queryStart, int queryEnd, Class<T> kind) { T[] ret = super.getSpans(queryStart, queryEnd, kind); reverse(ret); return ret; } }
public static void replaceUnderlineSpans(SpannableStringBuilder builder, Resources resources) { UnderlineSpan[] underlineSpans = builder.getSpans(0, builder.length(), UnderlineSpan.class); for (UnderlineSpan span : underlineSpans) { int start = builder.getSpanStart(span); int end = builder.getSpanEnd(span); builder.removeSpan(span); builder.setSpan(new SquigglySpan(resources), start, end, 0); } }
Object[] obj = mSpannableStringBuilder.getSpans(0, mSpannableStringBuilder.length(), ParagraphStyle.class); for (int i = 0; i < obj.length; i++) { int start = mSpannableStringBuilder.getSpanStart(obj[i]);
final Context context = ... // whereever your context is CharSequence sequence = Html.fromSource(context.getString(R.string.clickable_string)); SpannableStringBuilder strBuilder = new SpannableStringBuilder(sequence); UnderlineSpan[] underlines = strBuilder.getSpans(UnderlineSpan.class); for(UnderlineSpan span : underlines) { int start = strBuilder.getSpanStart(span); int end = strBuilder.getSpanEnd(span); int flags = strBuilder.getSpanFlags(span); ClickableSpan myActivityLauncher = new ClickableSpan() { public void onClick(View view) { context.startActivity(getIntentForActivityToStart()); } }; strBuilder.setSpan(myActivityLauncher, start, end, flags); } TextView textView = ... textView.setText(strBuilder); textView.setMovementMethod(LinkMovementMethod.getInstance());
SpannableStringBuilder newCueText = new SpannableStringBuilder(cueText); int cueLength = newCueText.length(); AbsoluteSizeSpan[] absSpans = newCueText.getSpans(0, cueLength, AbsoluteSizeSpan.class); RelativeSizeSpan[] relSpans = newCueText.getSpans(0, cueLength, RelativeSizeSpan.class); for (AbsoluteSizeSpan absSpan : absSpans) { newCueText.removeSpan(absSpan);
@Test public void testFontSizeWithEmptyValueIsIgnored() throws IOException, SubtitleDecoderException { TtmlSubtitle subtitle = getSubtitle(FONT_SIZE_EMPTY_TTML_FILE); assertThat(subtitle.getEventTimeCount()).isEqualTo(2); List<Cue> cues = subtitle.getCues(10 * 1000000); assertThat(cues).hasSize(1); SpannableStringBuilder spannable = (SpannableStringBuilder) cues.get(0).text; assertThat(String.valueOf(spannable)).isEqualTo("empty"); assertThat(spannable.getSpans(0, spannable.length(), RelativeSizeSpan.class)).hasLength(0); assertThat(spannable.getSpans(0, spannable.length(), AbsoluteSizeSpan.class)).hasLength(0); }
@Test public void testFontSizeWithMissingUnitIsIgnored() throws IOException, SubtitleDecoderException { TtmlSubtitle subtitle = getSubtitle(FONT_SIZE_MISSING_UNIT_TTML_FILE); assertThat(subtitle.getEventTimeCount()).isEqualTo(2); List<Cue> cues = subtitle.getCues(10 * 1000000); assertThat(cues).hasSize(1); SpannableStringBuilder spannable = (SpannableStringBuilder) cues.get(0).text; assertThat(String.valueOf(spannable)).isEqualTo("no unit"); assertThat(spannable.getSpans(0, spannable.length(), RelativeSizeSpan.class)).hasLength(0); assertThat(spannable.getSpans(0, spannable.length(), AbsoluteSizeSpan.class)).hasLength(0); }
@Test public void testFontSizeWithInvalidValueIsIgnored() throws IOException, SubtitleDecoderException { TtmlSubtitle subtitle = getSubtitle(FONT_SIZE_INVALID_TTML_FILE); assertThat(subtitle.getEventTimeCount()).isEqualTo(6); List<Cue> cues = subtitle.getCues(10 * 1000000); assertThat(cues).hasSize(1); SpannableStringBuilder spannable = (SpannableStringBuilder) cues.get(0).text; assertThat(String.valueOf(spannable)).isEqualTo("invalid"); assertThat(spannable.getSpans(0, spannable.length(), RelativeSizeSpan.class)).hasLength(0); assertThat(spannable.getSpans(0, spannable.length(), AbsoluteSizeSpan.class)).hasLength(0); cues = subtitle.getCues(20 * 1000000); assertThat(cues).hasSize(1); spannable = (SpannableStringBuilder) cues.get(0).text; assertThat(String.valueOf(spannable)).isEqualTo("invalid"); assertThat(spannable.getSpans(0, spannable.length(), RelativeSizeSpan.class)).hasLength(0); assertThat(spannable.getSpans(0, spannable.length(), AbsoluteSizeSpan.class)).hasLength(0); cues = subtitle.getCues(30 * 1000000); assertThat(cues).hasSize(1); spannable = (SpannableStringBuilder) cues.get(0).text; assertThat(String.valueOf(spannable)).isEqualTo("invalid dot"); assertThat(spannable.getSpans(0, spannable.length(), RelativeSizeSpan.class)).hasLength(0); assertThat(spannable.getSpans(0, spannable.length(), AbsoluteSizeSpan.class)).hasLength(0); }
private FixingResult addSpacesAroundSpansUntilFixed(SpannableStringBuilder builder, int widthMeasureSpec, int heightMeasureSpec) { Object[] spans = builder.getSpans(0, builder.length(), Object.class); List<Object> spansWithSpacesBefore = new ArrayList<>(spans.length); List<Object> spansWithSpacesAfter = new ArrayList<>(spans.length); for (Object span : spans) { int spanStart = builder.getSpanStart(span); if (isNotSpace(builder, spanStart - 1)) { builder.insert(spanStart, " "); spansWithSpacesBefore.add(span); } int spanEnd = builder.getSpanEnd(span); if (isNotSpace(builder, spanEnd)) { builder.insert(spanEnd, " "); spansWithSpacesAfter.add(span); } try { setTextAndMeasure(builder, widthMeasureSpec, heightMeasureSpec); return FixingResult.fixed(spansWithSpacesBefore, spansWithSpacesAfter); } catch (IndexOutOfBoundsException ignored) { } } if (HtmlTextView.DEBUG) { Log.d(HtmlTextView.TAG, "Could not fix the Spanned by adding spaces around spans"); } return FixingResult.notFixed(); }
Object[] spans = builder.getSpans(matcher.start(), matcher.end(), ImageSpan.class); if (spans == null || spans.length == 0) { builder.setSpan(new ImageSpan(smiley), matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
TextView decription = (TextView)convertView.findViewById(R.id.library_rss_expan_chaild_des_textView); String dec=d.get_description()+"<a href='"+d.get_link()+"'><u>more</u></a>"; CharSequence sequence = Html.fromHtml(dec); SpannableStringBuilder strBuilder = new SpannableStringBuilder(sequence); UnderlineSpan[] underlines = strBuilder.getSpans(0, 10, UnderlineSpan.class); for(UnderlineSpan span : underlines) { int start = strBuilder.getSpanStart(span); int end = strBuilder.getSpanEnd(span); int flags = strBuilder.getSpanFlags(span); ClickableSpan myActivityLauncher = new ClickableSpan() { public void onClick(View view) { Log.e(TAG, "on click"); Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(d.get_link())); mContext.startActivity(intent); } }; strBuilder.setSpan(myActivityLauncher, start, end, flags); } decription.setText(strBuilder); decription.setLinksClickable(true); decription.setMovementMethod(LinkMovementMethod.getInstance());
/** * check whether contains (inline) code syntax * * @param ssb the content * @param position start position * @param keyLength the checking words' length * @return TRUE: contains */ public static boolean existCodeSyntax(SpannableStringBuilder ssb, int position, int keyLength) { TypefaceSpan[] spans = ssb.getSpans(position, position + keyLength, TypefaceSpan.class); return spans.length != 0; }
/** * check whether contains image syntax * * @param ssb the content * @param position start position * @param keyLength the checking words' length * @return TRUE: contains */ public static boolean existImageSyntax(SpannableStringBuilder ssb, int position, int keyLength) { MDImageSpan[] spans = ssb.getSpans(position, position + keyLength, MDImageSpan.class); return spans.length != 0; }
/** * check whether contains hyper link syntax * * @param ssb the content * @param position start position * @param keyLength the checking words' length * @return TRUE: contains */ public static boolean existHyperLinkSyntax(SpannableStringBuilder ssb, int position, int keyLength) { URLSpan[] spans = ssb.getSpans(position, position + keyLength, URLSpan.class); return spans.length != 0; }
/** * check whether exists code block span * * @param ssb the text * @param start the start position * @param end the end position * @return if exists, return true */ public static boolean existCodeBlockSpan(@NonNull SpannableStringBuilder ssb, int start, int end) { MDCodeBlockSpan[] mdCodeBlockSpans = ssb.getSpans(start, end, MDCodeBlockSpan.class); return mdCodeBlockSpans != null && mdCodeBlockSpans.length > 0; }
private Object getLast(Class<? extends Object> kind) { /* * This knows that the last returned object from getSpans() * will be the most recently added. */ Object[] objs = mResult.getSpans(0, mResult.length(), kind); return objs.length == 0 ? null : objs[objs.length - 1]; }
public ImageSpan[] getImageSpans(Spanned original, Class<ImageSpan> sourceType) { SpannableStringBuilder result = new SpannableStringBuilder(original); ImageSpan[] spans = result.getSpans(0, result.length(), sourceType); return spans; }
private <T> void remove(SpannableStringBuilder sb,Class<T> c){ T[] spans = sb.getSpans(0,sb.length(), c); if(spans!=null){ for (int i = 0; i < spans.length; i++) { sb.removeSpan(spans[i]); } } }
/** * @return the text as an {@link Editable} (note: not a {@link MentionsEditable} and does not contain mentions) */ private Editable getTextWithoutMentions() { Editable text = getText(); SpannableStringBuilder sb = new SpannableStringBuilder(text); MentionSpan[] spans = sb.getSpans(0, sb.length(), MentionSpan.class); for (MentionSpan span: spans) { sb.removeSpan(span); } return sb; }
@Override public void onImageReady(String source, int start, int end, Drawable d) { Image[] is = spannedBuilder.getSpans(start, end, Image.class); for (Image i : is) { spannedBuilder.removeSpan(i); } setSpan(start, end, new Image(source, d)); notify.notifyViewChange(); } }