private SpannableString applyLetterSpacing(String text) { StringBuilder builder = new StringBuilder(); for (int i = 0; i < text.length(); i++) { builder.append(text.charAt(i)); if (i + 1 < text.length() && !isEmojiCharacter(text.charAt(i))) {//avoid adding the blank code between the emoji code builder.append("\u00A0"); } } SpannableString finalText = new SpannableString(builder.toString()); if (builder.toString().length() > 1) { for (int i = 1; i < builder.toString().length(); i += 2) { if (builder.toString().toCharArray()[i] == 160) {//avoid breaking emoji code, u00A0 is text space finalText.setSpan(new ScaleXSpan((mLetterSpace + 1) / 10), i, i + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } } } return finalText; }
@SuppressWarnings("unused") public void bind(int position, TweetPublishModel model, RequestManager loader) { itemView.setTag(model); Context context = itemView.getContext(); Spannable spannable = TweetParser.getInstance().parse(context, model.getContent()); mTitle.setText(spannable); mTitle.setMovementMethod(LinkMovementMethod.getInstance()); mTitle.setFocusable(false); mTitle.setDispatchToParent(true); mTitle.setLongClickable(false); mLog.setText(String.format("Error:%s.", model.getErrorString() == null ? "null" : model.getErrorString())); mDate.setText(FORMAT.format(new Date(model.getDate()))); }
/** * 检查当前位置是否命中在spannable上, 如果是, 返回spannable的start position */ private int findStartPosition(Spannable spannable, int startWidthPosition) { CharacterStyle[] oldSpans = spannable.getSpans(startWidthPosition, spannable.length(), CharacterStyle.class); int position = startWidthPosition; for (CharacterStyle oldSpan : oldSpans) { int spanStart = spannable.getSpanStart(oldSpan); int spanEnd = spannable.getSpanEnd(oldSpan); if (spanStart <= startWidthPosition && spanEnd > startWidthPosition) { position = spanStart; } if (spanStart >= startWidthPosition) { spannable.removeSpan(oldSpan); } } //L.e("call: findStartPosition([spannable, startWidthPosition]) " + startWidthPosition + " -> " + position); return position; }
public ITouchableSpan 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); if (x < layout.getLineLeft(line) || x > layout.getLineRight(line)) { // 实际上没点到任何内容 off = -1; } ITouchableSpan[] link = spannable.getSpans(off, off, ITouchableSpan.class); ITouchableSpan touchedSpan = null; if (link.length > 0) { touchedSpan = link[0]; } return touchedSpan; }
/** * @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; }
@Override public void convert(EasyLVHolder holder, int position, BookMark item) { TextView tv = holder.getView(R.id.tvMarkItem); SpannableString spanText = new SpannableString((position + 1) + ". " + item.title + ": "); spanText.setSpan(new ForegroundColorSpan(ContextCompat.getColor(mContext, R.color.light_coffee)), 0, spanText.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); tv.setText(spanText); if (item.desc != null) { tv.append(item.desc .replaceAll(" ", "") .replaceAll(" ", "") .replaceAll("\n", "")); } }
public static Editable formatHash(@Nullable final String prefix, final String address, final int groupSize, final int lineSize, final char groupSeparator) { final SpannableStringBuilder builder = prefix != null ? new SpannableStringBuilder(prefix) : new SpannableStringBuilder(); final int len = address.length(); for (int i = 0; i < len; i += groupSize) { final int end = i + groupSize; final String part = address.substring(i, end < len ? end : len); builder.append(part); builder.setSpan(new TypefaceSpan("monospace"), builder.length() - part.length(), builder.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); if (end < len) { final boolean endOfLine = lineSize > 0 && end % lineSize == 0; builder.append(endOfLine ? '\n' : groupSeparator); } } return builder; }
public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) { if (event.getAction() == 1) { this.mLinkClicked = false; this.mClickedLink = null; int x = (((int) event.getX()) - widget.getTotalPaddingLeft()) + widget.getScrollX(); int y = (((int) event.getY()) - widget.getTotalPaddingTop()) + widget.getScrollY(); Layout layout = widget.getLayout(); int off = layout.getOffsetForHorizontal(layout.getLineForVertical(y), (float) x); ClickableSpan[] link = (ClickableSpan[]) buffer.getSpans(off, off, ClickableSpan .class); if (link.length != 0) { SensibleUrlSpan span = link[0]; this.mLinkClicked = span.onClickSpan(widget); this.mClickedLink = span.getURL(); return this.mLinkClicked; } } super.onTouchEvent(widget, buffer, event); return false; }
/** * Replaces the blue line produced by <blockquote>s with something more visible * * @param spannable parsed comment text #fromHtml */ private void replaceQuoteSpans(Spannable spannable) { QuoteSpan[] quoteSpans = spannable.getSpans(0, spannable.length(), QuoteSpan.class); for (QuoteSpan quoteSpan : quoteSpans) { final int start = spannable.getSpanStart(quoteSpan); final int end = spannable.getSpanEnd(quoteSpan); final int flags = spannable.getSpanFlags(quoteSpan); spannable.removeSpan(quoteSpan); //If the theme is Light or Sepia, use a darker blue; otherwise, use a lighter blue final int barColor = (SettingValues.currentTheme == 1 || SettingValues.currentTheme == 5) ? ContextCompat.getColor(getContext(), R.color.md_blue_600) : ContextCompat.getColor(getContext(), R.color.md_blue_400); final int BAR_WIDTH = 4; final int GAP = 5; spannable.setSpan(new CustomQuoteSpan(Color.TRANSPARENT, //background color barColor, //bar color BAR_WIDTH, //bar width GAP), //bar + text gap start, end, flags); } }
/** * Replace the system emoticons with the provided custom emoticons drawable. This will find the * unicodes with supported emoticons in the provided text and will replace the emoticons with * appropriate images. * * @param context instance of caller. * @param text Text to replace * @param emoticonProvider {@link EmoticonProvider} for emoticons images * @param emoticonSize Size of the emoticons in dp * @return Modified text. */ public static void replaceWithImages(@NonNull final Context context, @NonNull final Spannable text, @NonNull final EmoticonProvider emoticonProvider, final int emoticonSize) { final EmoticonSpan[] existingSpans = text.getSpans(0, text.length(), EmoticonSpan.class); final ArrayList<Integer> existingSpanPositions = new ArrayList<>(existingSpans.length); for (EmoticonSpan existingSpan : existingSpans) { existingSpanPositions.add(text.getSpanStart(existingSpan)); } //Get location and unicode of all emoticons. final List<EmoticonRange> findAllEmojis = findAllEmoticons(context, text, emoticonProvider); //Replace all the emoticons with their relatives. for (int i = 0; i < findAllEmojis.size(); i++) { final EmoticonRange location = findAllEmojis.get(i); if (!existingSpanPositions.contains(location.mStartPos)) { text.setSpan(new EmoticonSpan(context, location.mEmoticon.getIcon(), emoticonSize), location.mStartPos, location.mEndPos, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } } }
public CharSequence getformatedSearchSnippet() { //TODO implement improved snippet function String CleanedSearchString = " " + ArabicUtilities.cleanTextForSearchingWthStingBuilder(searchString) + " "; StringBuilder cleanedUnformattedPage = new StringBuilder(ArabicUtilities.cleanTextForSearchingWthStingBuilder(unformatedPage)); int firstMatchStart = cleanedUnformattedPage.indexOf(CleanedSearchString); cleanedUnformattedPage.delete(0, Math.max(firstMatchStart - 100, 0)); cleanedUnformattedPage.delete( Math.min(firstMatchStart + CleanedSearchString.length() + 100, cleanedUnformattedPage.length()) , cleanedUnformattedPage.length()); cleanedUnformattedPage.insert(0, "..."); cleanedUnformattedPage.append("..."); Spannable snippet = SpannableString. valueOf(cleanedUnformattedPage.toString()); int index = TextUtils.indexOf(snippet, CleanedSearchString); while (index >= 0) { snippet.setSpan(new BackgroundColorSpan(0xFF8B008B), index, index + CleanedSearchString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); index = TextUtils.indexOf(snippet, CleanedSearchString, index + CleanedSearchString.length()); } return snippet; }
private void displayPlaylistInfo(final Playlist playlist) { final TextView textView = new TextView(this); textView.setPadding(5, 5, 5, 5); final Spannable message = new SpannableString("Owner: " + playlist.getOwner() + "\nComments: " + ((playlist.getComment() == null) ? "" : playlist.getComment()) + "\nSong Count: " + playlist.getSongCount() + ((playlist.getPublic() == null) ? "" : ("\nPublic: " + playlist.getPublic()) + ((playlist.getCreated() == null) ? "" : ("\nCreation Date: " + playlist.getCreated().replace('T', ' '))))); Linkify.addLinks(message, Linkify.WEB_URLS); textView.setText(message); textView.setMovementMethod(LinkMovementMethod.getInstance()); new AlertDialog.Builder(this).setTitle(playlist.getName()).setCancelable(true).setIcon(android.R.drawable.ic_dialog_info).setView(textView).show(); }
/** * Create Span for matches in paragraph's. Note that this will highlight the full matched pattern * (including optionals) if no group parameters are given. * * @param editable Text editable * @param pattern The pattern to match * @param creator A ParcelableSpanCreator for ParcelableSpan * @param groupsToMatch (optional) groups to be matched, indexes start at 1. */ protected void createSpanForMatchesP(final Editable editable, final Pattern pattern, final ParagraphStyleCreator creator, int... groupsToMatch) { if (groupsToMatch == null || groupsToMatch.length < 1) { groupsToMatch = new int[]{0}; } int i = 0; for (Matcher m = pattern.matcher(editable); m.find(); i++) { ParagraphStyle span = creator.create(m, i); if (span != null) { for (int g : groupsToMatch) { if (g == 0 || g <= m.groupCount()) { editable.setSpan(span, m.start(g), m.end(g), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } } } } }
public static void setAndMergeSpans(Spannable text, Object what, int start, int end, int flags) { Object[] spans = text.getSpans(Math.max(start - 1, 0), Math.min(end + 1, 0), what.getClass()); for (Object span : spans) { if (!areSpansEqual(span, what)) continue; int sFlags = text.getSpanFlags(span); if ((sFlags & Spanned.SPAN_COMPOSING) != 0) continue; int sStart = text.getSpanStart(span); int sEnd = text.getSpanEnd(span); if (sEnd < start || sStart > end) continue; text.removeSpan(span); if (sStart < start) start = sStart; if (sEnd > end) end = sEnd; } text.setSpan(what, start, end, flags); }
private static void gatherPhoneLinks(ArrayList<LinkSpec> links, Spannable s, Pattern pattern, Pattern[] excepts, String[] schemes, MatchFilter matchFilter, TransformFilter transformFilter) { Matcher m = pattern.matcher(s); while (m.find()) { if (isInExcepts(m.group(), excepts)) { continue; } int start = m.start(); int end = m.end(); if (matchFilter == null || matchFilter.acceptMatch(s, start, end)) { LinkSpec spec = new LinkSpec(); String url = makeUrl(m.group(0), schemes, m, transformFilter); spec.url = url; spec.start = start; spec.end = end; links.add(spec); } } }
static void replaceWithImages(@NonNull final Context context, @NonNull final Spannable text, @NonNull final EmoticonProvider emoticonProvider, final int emoticonSize) { final EmoticonSpan[] existingSpans = text.getSpans(0, text.length(), EmoticonSpan.class); final ArrayList<Integer> existingSpanPositions = new ArrayList<>(existingSpans.length); for (EmoticonSpan existingSpan : existingSpans) { existingSpanPositions.add(text.getSpanStart(existingSpan)); } final List<EmoticonRange> findAllEmojis = findAllEmoticons(text, emoticonProvider); for (int i = 0; i < findAllEmojis.size(); i++) { final EmoticonRange location = findAllEmojis.get(i); if (!existingSpanPositions.contains(location.mStartPos)) { text.setSpan(EmoticonSpan.create(context, location.mEmoticon.getIcon(), emoticonSize), location.mStartPos, location.mEndPos, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } } }
public SpannableStringBuilder spannerbleTitleForHeaderInSection( ATableView tableView, int section) { HH2SectionData sd = data.get(section); String text = sd.getHeader(); SpannableStringBuilder builder = new SpannableStringBuilder(text); builder.setSpan(new ForegroundColorSpan(Color.BLUE), 0, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); if (text.contains("$")) { int index = text.indexOf("$") + 1; builder.setSpan(new ForegroundColorSpan(Color.RED), index, text.length(), SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE); builder.setSpan(new RelativeSizeSpan(0.55f), index, text.length(), SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE); builder.replace(index - 1, index, "\n"); } return builder; }
@Override public void onBindViewHolder(ResultViewHolder viewHolder, int position) { SearchItem item = mResultList.get(position); viewHolder.icon_left.setImageResource(item.get_icon()); viewHolder.icon_left.setColorFilter(SearchView.getIconColor(), PorterDuff.Mode.SRC_IN); viewHolder.text.setTypeface((Typeface.create(SearchView.getTextFont(), SearchView.getTextStyle()))); viewHolder.text.setTextColor(SearchView.getTextColor()); String itemText = item.get_text().toString(); String itemTextLower = itemText.toLowerCase(Locale.getDefault()); if (itemTextLower.contains(key) && !key.isEmpty()) { SpannableString s = new SpannableString(itemText); s.setSpan(new ForegroundColorSpan(SearchView.getTextHighlightColor()), itemTextLower.indexOf(key), itemTextLower.indexOf(key) + key.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); viewHolder.text.setText(s, TextView.BufferType.SPANNABLE); } else { viewHolder.text.setText(item.get_text()); } }
private void highlightTerm(TextView tv, String query, String originalString){ if (query != null && !query.isEmpty()) { int startPos = originalString.toLowerCase().indexOf(query.toLowerCase()); int endPos = startPos + query.length(); if (startPos != -1) { Spannable spannable = new SpannableString(originalString); ColorStateList blackColor = new ColorStateList(new int[][]{new int[]{}}, new int[]{Color.BLACK}); TextAppearanceSpan highlightSpan = new TextAppearanceSpan(null, Typeface.BOLD, -1, blackColor, null); spannable.setSpan(highlightSpan, startPos, endPos, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); tv.setText(spannable); } else { tv.setText(originalString); } } else { tv.setText(originalString); } }
@Override public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) { int action = event.getAction(); if (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 = buffer.getSpans(off, off, ClickableSpan.class); if (link.length != 0) { link[0].onClick(widget); return true; } else { Selection.removeSelection(buffer); } } return super.onTouchEvent(widget, buffer, event); }
private void applySpan(Spannable spannable, @ColorInt int color, int start, int end) { spannable.setSpan( new ForegroundColorSpan(color), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); }
@Override public Spannable getContentSummary(TestMessage data) { if (data == null) return null; String content = data.getContent(); if (content != null) { if (content.length() > 100) { content = content.substring(0, 100); } return new SpannableString(AndroidEmoji.ensure(content)); } return null; }
/** * Highlights everything that matched the current filter (if any) in text * * @param text the text to highlight * @param context a context to get the default highlight color from * @return a spannable string */ protected Spannable highlight(String text, Context context) { if (mDefaultHighlightColor == null){ TypedArray array = context.obtainStyledAttributes(new int[]{ android.R.attr.textColorHighlight}); mDefaultHighlightColor = array.getColor(0, 0x6633B5E5); array.recycle(); } return highlight(text, mDefaultHighlightColor); }
@Override public void initUI() { SpannableStringBuilder ssb = new SpannableStringBuilder(); //系统通知图片 ImageSpan imageSpan = new ImageSpan(context,R.drawable.img_dm_xttz); SpannableString spannableString = new SpannableString("tips"); spannableString.setSpan(imageSpan,0,spannableString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); ssb.append(spannableString); //系统通知内容 ssb.append(getText(R.string.tips_notice_desc)); tvTips.setText(ssb); }
@VisibleForTesting static CharSequence toFriendly(Organizer organizer, Contacts contacts, boolean showCorrespondentNames, boolean changeContactNameColor, int contactNameColor) { if (organizer == null) { return null; } if (!showCorrespondentNames) { return organizer.getEmail(); } else if (contacts != null) { final String name = contacts.getNameForAddress(organizer.getEmail()); // TODO: The results should probably be cached for performance reasons. if (name != null) { if (changeContactNameColor) { final SpannableString coloredName = new SpannableString(name); coloredName.setSpan(new ForegroundColorSpan(contactNameColor), 0, coloredName.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE ); return coloredName; } else { return name; } } } return (!TextUtils.isEmpty(organizer.getCommonName())) ? organizer.getCommonName() : organizer.getEmail(); }
/** * replace existing spannable with smiles * @param context * @param spannable * @return */ public static boolean addSmiles(Context context, Spannable spannable) { boolean hasChanges = false; for (Entry<Pattern, Object> entry : emoticons.entrySet()) { Matcher matcher = entry.getKey().matcher(spannable); while (matcher.find()) { boolean set = true; for (ImageSpan span : spannable.getSpans(matcher.start(), matcher.end(), ImageSpan.class)) if (spannable.getSpanStart(span) >= matcher.start() && spannable.getSpanEnd(span) <= matcher.end()) spannable.removeSpan(span); else { set = false; break; } if (set) { hasChanges = true; Object value = entry.getValue(); if(value instanceof String && !((String) value).startsWith("http")){ File file = new File((String) value); if(!file.exists() || file.isDirectory()){ return false; } spannable.setSpan(new ImageSpan(context, Uri.fromFile(file)), matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); }else{ spannable.setSpan(new ImageSpan(context, (Integer)value), matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } } } } return hasChanges; }
private void setData(SuperViewHolder holder, StockEntity.StockInfo item) { final String stockNameAndCode = item.stock_name + "\n" + item.stock_code; SpannableStringBuilder ssb = new SpannableStringBuilder(stockNameAndCode); ssb.setSpan(new ForegroundColorSpan(Color.parseColor("#a4a4a7")), item.stock_name.length(), stockNameAndCode.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); ssb.setSpan(new AbsoluteSizeSpan(dip2px(holder.itemView.getContext(), 13)), item.stock_name.length(), stockNameAndCode.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); ((TextView) holder.getView(R.id.tv_stock_name_code)).setText(ssb); ((TextView) holder.getView(R.id.tv_current_price)).setText(item.current_price); ((TextView) holder.getView(R.id.tv_rate)).setText(item.rate < 0 ? String.format("%.2f", item.rate) : ("+" + String.format("%.2f", item.rate)) + "%"); }
/** * Append the styled text in textField to the supplied builder. * * @param builder The builder to append the text to. * @param textField The text field (with text and type) to append. * @param maxTextHeightSp The height in SP of the largest text field in the entire line. Used to * top-align text when specified. * @param metrics Font metrics which will be used to properly size and layout images and top- * aligned text. * @param density Screen density which will be used to properly size and layout images and top- * aligned text. */ private static void appendAndStyleText( SpannableStringBuilder builder, SuggestionAnswer.TextField textField, int maxTextHeightSp, Paint.FontMetrics metrics, float density) { String text = textField.getText(); int type = textField.getType(); // Unescape HTML entities (e.g. """, ">"). text = Html.fromHtml(text).toString(); // Append as HTML (answer responses contain simple markup). int start = builder.length(); builder.append(Html.fromHtml(text)); int end = builder.length(); // Apply styles according to the type. AbsoluteSizeSpan sizeSpan = new AbsoluteSizeSpan(getAnswerTextSizeSp(type), true); builder.setSpan(sizeSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); ForegroundColorSpan colorSpan = new ForegroundColorSpan(getAnswerTextColor(type)); builder.setSpan(colorSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); if (type == ANSWERS_TOP_ALIGNED_TEXT_TYPE) { TopAlignedSpan topAlignedSpan = new TopAlignedSpan( ANSWERS_TOP_ALIGNED_TEXT_SIZE_SP, maxTextHeightSp, metrics, density); builder.setSpan(topAlignedSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } }
public SpannableStringBuilder spannerbleTitleForHeaderInSection( ATableView tableView, int section) { SpannableStringBuilder builder = super .spannerbleTitleForHeaderInSection(tableView, section); SpannableString append = new SpannableString(String.format( " 凡%d方", data.get(section).getData().size())); append.setSpan(new ForegroundColorSpan(Color.BLUE), 0, append.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); builder.append(append); return builder; }
@Override public void onSetUpView() { EMTextMessageBody txtBody = (EMTextMessageBody) message.getBody(); Spannable span = EaseSmileUtils.getSmiledText(context, txtBody.getMessage()); String money = message.getStringAttribute("transferMoney ", ""); // 设置内容 if (StringUtils.isNotEmpty(money)) { contentView.setText(money); } else { contentView.setText("0.0"); } handleTextMessage(); }
/** * Sets the action bar title using the specified font. * * @param font The font to use. * @param title The title to set. */ @SuppressWarnings("SameParameterValue") public static void styleActionBar(ActionBar actionBar, FontManager.Font font, String title) { SpannableString actionBarTitle = new SpannableString(title); // ActionBar font actionBarTitle.setSpan(new TypefaceSpan(font), 0, actionBarTitle.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); actionBar.setTitle(actionBarTitle); }
public static void renderItemNumber(SpannableStringBuilder builder) { String string = builder.toString(); if (!string.contains("、") || !isNumeric(string.substring(0, string.indexOf("、")))) { return; } ForegroundColorSpan numSpan = new ForegroundColorSpan(Color.BLUE); builder.setSpan(numSpan, 0, string.indexOf("、"), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); }
@Override public void removeOldHighlightedSpans() { Spannable spannableString = (Spannable) payloadTextView.getText(); BackgroundColorSpan[] backgroundSpans = spannableString.getSpans(0, spannableString.length(), BackgroundColorSpan.class); for (BackgroundColorSpan span : backgroundSpans) { spannableString.removeSpan(span); } }
@Override public void bind(int position, EditSourceListBean data) { mFB.display(mImgBg, data.imgBgUrl); mFB.display(mImgCatgy, data.ImgCatgyUrl); mTextLeft.setText(data.textLeft); Resources resources = getView().getResources(); SpannableStringBuilder spans = new SpannableStringBuilder(resources.getString(R.string.i_m_category_text_sign_count, data.textSignSize)); spans.setSpan(new ForegroundColorSpan(resources.getColor(R.color.text_title_orange)), 0, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); spans.setSpan(new ForegroundColorSpan(resources.getColor(R.color.text_title_orange)), spans.length() - 3, spans.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); mTextSignSize.setText(spans); }
/** * Настройка отображения уведомления типа "reply_topic" * * @param notification уведомление * @param holder контейнер в елементами интерфейса */ public void configReplyTopicFeedback(ReplyCommentFeedback notification, FeedbackAdapter.CommentHolder holder) { Topic topic = (Topic) notification.getCommentsOf(); Comment feedback = notification.getFeedbackComment(); Spannable feedBackText = OwnerLinkSpanFactory.withSpans(feedback.getText(), true, true, mLinkActionAdapter); holder.cOwnerText.setText(feedBackText); holder.cOwnerText.setVisibility(TextUtils.isEmpty(feedBackText) ? View.GONE : View.VISIBLE); AttachmentsHolder containers = AttachmentsHolder.forFeedback(holder.vAttachmentsRoot); attachmentsViewBinder.displayAttachments(feedback.getAttachments(), containers, true); String action = getDateFromUnixTime(feedback.getDate()); action = action + SPACE + context.getString(R.string.in_reply_to_your_message_in_topic); Link parentLink = Link.startOf(action.length()); action = action + SPACE + topic.getTitle(); parentLink.end(action.length()); Spannable spannable = Spannable.Factory.getInstance().newSpannable(action); showAsLink(spannable, parentLink); holder.cOwnerName.setText(feedback.getFullAuthorName()); holder.cOwnerTime.setText(spannable, TextView.BufferType.SPANNABLE); holder.cChangable.setVisibility(View.GONE); PicassoInstance.with() .load(feedback.getMaxAuthorAvaUrl()) .tag(Constants.PICASSO_TAG) .transform(transformation) .into(holder.cOwnerAvatar); holder.ivRightAttachment.setVisibility(View.GONE); solveOwnerOpenByAvatar(holder.cOwnerAvatar, feedback.getFromId()); configReply(notification.getReply(), holder); }
/** * Настройка отображения уведомления типа "reply_comment_photo" * * @param notification уведомление * @param holder контейнер в елементами интерфейса */ public void configReplyCommentPhotoFeedback(ReplyCommentFeedback notification, FeedbackAdapter.CommentHolder holder) { Comment parent = notification.getOwnComment(); Comment feedback = notification.getFeedbackComment(); setupAttachmentViewWithPhoto((Photo) notification.getCommentsOf(), holder.ivRightAttachment); String feedBackText = OwnerLinkSpanFactory.getTextWithCollapseOwnerLinks(feedback.getText()); String action = getDateFromUnixTime(feedback.getDate()); action = action + SPACE + context.getString(R.string.in_reply_to_your_comment); String parentText; if (TextUtils.isEmpty(parent.getText())) { parentText = context.getString(R.string.from_date, getDateFromUnixTime(parent.getDate())); } else { parentText = reduce(OwnerLinkSpanFactory.getTextWithCollapseOwnerLinks(parent.getText())); } Link parentLink = Link.startOf(action.length()); action = action + SPACE + parentText; parentLink.end(action.length()); Spannable spannable = Spannable.Factory.getInstance().newSpannable(action); showAsLink(spannable, parentLink); holder.cOwnerName.setText(feedback.getFullAuthorName()); holder.cOwnerText.setText(feedBackText); holder.cOwnerText.setVisibility(TextUtils.isEmpty(feedBackText) ? View.GONE : View.VISIBLE); holder.cOwnerTime.setText(spannable, TextView.BufferType.SPANNABLE); holder.cChangable.setVisibility(View.GONE); AttachmentsHolder containers = AttachmentsHolder.forFeedback(holder.vAttachmentsRoot); attachmentsViewBinder.displayAttachments(feedback.getAttachments(), containers, true); showUserAvatarOnImageView(feedback.getMaxAuthorAvaUrl(), holder.cOwnerAvatar); solveOwnerOpenByAvatar(holder.cOwnerAvatar, feedback.getFromId()); configReply(notification.getReply(), holder); }
@Override public void highlight(@NonNull Editable allText, @NonNull CharSequence textToHighlight, int start) { mCommentRegion.clear(); for (Matcher m = XML_COMMENTS.matcher(textToHighlight); m.find(); ) { allText.setSpan(new ForegroundColorSpan(codeTheme.getCommentColor()), start + m.start(), start + m.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); mCommentRegion.add(new Pair<>(start + m.start(), start + m.end())); } }
@Override public void setCompanyTel(String tel) { this.tel = tel; String companyTel = getString(R.string.phone_number) + "\n" + tel; Spannable spannable = new SpannableStringBuilder(companyTel); spannable.setSpan(new StyleSpan(Typeface.BOLD), 0, companyTel.length() - tel.length() - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); spannable.setSpan(new URLSpan(tel), companyTel.length() - tel.length(), companyTel.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); textViewTel.setText(spannable); }