@Override public void afterTextChanged(Editable text) { if (!historyEnable || historyWorking) { return; } inputLast = new SpannableStringBuilder(text); if (text != null && text.toString().equals(inputBefore.toString())) { return; } if (historyList.size() >= historySize) { historyList.remove(0); } historyList.add(inputBefore); historyCursor = historyList.size(); }
@Test public void whenSettingText_ShouldFireOnTextChangedWithCorrectArguments() { textView.setText(INITIAL_TEXT); TextWatcher mockTextWatcher = mock(TextWatcher.class); textView.addTextChangedListener(mockTextWatcher); textView.setText(NEW_TEXT); ArgumentCaptor<SpannableStringBuilder> builderCaptor = ArgumentCaptor.forClass(SpannableStringBuilder.class); verify(mockTextWatcher).onTextChanged(builderCaptor.capture(), eq(0), eq(INITIAL_TEXT.length()), eq(NEW_TEXT.length())); assertThat(builderCaptor.getValue().toString()).isEqualTo(NEW_TEXT); }
@Test public void whenSettingTextToNull_WatchersSeeEmptyString() { TextWatcher mockTextWatcher = mock(TextWatcher.class); textView.addTextChangedListener(mockTextWatcher); textView.setText(null); ArgumentCaptor<SpannableStringBuilder> builderCaptor = ArgumentCaptor.forClass(SpannableStringBuilder.class); verify(mockTextWatcher).onTextChanged(builderCaptor.capture(), eq(0), eq(0), eq(0)); assertThat(builderCaptor.getValue().toString()).isEmpty(); }
@Test public void whenAppendingText_ShouldFireOnTextChangedWithCorrectArguments() { textView.setText(INITIAL_TEXT); TextWatcher mockTextWatcher = mock(TextWatcher.class); textView.addTextChangedListener(mockTextWatcher); textView.append(NEW_TEXT); ArgumentCaptor<SpannableStringBuilder> builderCaptor = ArgumentCaptor.forClass(SpannableStringBuilder.class); verify(mockTextWatcher).onTextChanged(builderCaptor.capture(), eq(0), eq(INITIAL_TEXT.length()), eq(INITIAL_TEXT.length())); assertThat(builderCaptor.getValue().toString()).isEqualTo(INITIAL_TEXT + NEW_TEXT); }
ViewUtils.getSingleLineTextSize(displayText.toString(), paint, width - titleInsetStart - titleInsetEnd, collapsedTextSize,
return builder.toString();
private String getTypedText() { return mDefaultKeySsb.toString(); }
/** * return the spannable index of character '(' * * @param str SpannableStringBuilder to apply typeface changes * @return index of '(' */ private int getSpannableIndex(SpannableStringBuilder str) { return str.toString().indexOf("(") + 1; }
/** * return the spannable index of character '(' * * @param str SpannableStringBuilder to apply typeface changes * @return index of '(' */ private int getSpannableIndex(SpannableStringBuilder str) { return str.toString().indexOf("(") + 1; }
private static void colorize(final SpannableStringBuilder sb, final String pattern, @ColorInt final int color) { final Pattern p = Pattern.compile(pattern); final Matcher m = p.matcher(sb.toString()); while (m.find()) { final CharacterStyle span = new ForegroundColorSpan(color); sb.setSpan(span, m.start(), m.end(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); } } }
@Override SpannableStringBuilder format(@NonNull SpannableStringBuilder ssb, int lineNumber) { String text = ssb.toString(); return parse(text, ssb); }
@Override SpannableStringBuilder format(@NonNull SpannableStringBuilder ssb, int lineNumber) { String text = ssb.toString(); return parse(text, ssb); }
private static void setUrlSpanForAddress(String domain, String address, SpannableStringBuilder builder) { int spanBegin = builder.toString().indexOf(domain); if (spanBegin >= 0) { URLSpan urlSpan = new URLSpan("https://" + domain + "/address/" + address); builder.setSpan(urlSpan, spanBegin, spanBegin + domain.length(), SpannableStringBuilder.SPAN_INCLUSIVE_INCLUSIVE); } }
public void setContentSpan(SpannableStringBuilder contentSpan) { this.contentSpan = contentSpan; this.isShowCheckAll = Utils.calculateShowCheckAllText(contentSpan.toString()); }
protected static boolean replace(SpannableStringBuilder ssb, String key, String replace) { boolean isHandledBackSlash = false; int index; while (true) { String text = ssb.toString(); index = text.indexOf(key); if (index == -1) { break; } isHandledBackSlash = true; ssb.replace(index, index + key.length(), replace); } return isHandledBackSlash; }
SpannableStringBuilder sb = new SpannableStringBuilder("text has <sup>superscript</sup> tag"); Pattern p = Pattern.compile("<sup>.*?</sup>", Pattern.CASE_INSENSITIVE); boolean stop = false; while (!stop) { Matcher m = p.matcher(sb.toString()); if (m.find()) { sb.setSpan(new SuperscriptSpan(), m.start(), m.end(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); sb.delete(m.end()-6, m.end()); sb.delete(m.start(), m.start() + 5); } else stop = true; }
@Override public String toString(){ int len = mSpannableString.length(); if(len == 0) return "<EMPTY>"; if(len < 70) return mSpannableString.toString(); return mSpannableString.subSequence(0,30).toString() + " ~...~ " + mSpannableString.subSequence(len-30, len - 1).toString(); }
/** * 此操作是异步的,注意 * @param builder 包含公式的文本,以SpannableStringBuilder身份传入 */ private void retrieveOnlineImg(final SpannableStringBuilder builder) { String text = builder.toString(); mFormulaList = getAllFormulas(text); showPlaceHolder(builder); retrieveFormulaOnlineImg(builder, 0); }
private static String getTextWithPasswords(CharSequence seq) { SpannableStringBuilder lstr = new SpannableStringBuilder(seq); for (PasswordSpan span : lstr.getSpans(0, lstr.length(), PasswordSpan.class)) { lstr.replace(lstr.getSpanStart(span), lstr.getSpanEnd(span), span.mPassword); lstr.removeSpan(span); } return lstr.toString(); }
@Override public void setText(CharSequence text, BufferType type) { if (isNull(text)) { super.setText(text, type); } else { super.setText(new SpannableStringBuilder() .append(prefix) .append(text) .append(suffix) .toString(), type); } this.text = text; }