@Override protected void internalUpdate(XySeriesInfo seriesInfo) { final SpannableStringBuilder sb = new SpannableStringBuilder(); sb.append("X: ").append(seriesInfo.getFormattedXValue()).append(StringUtil.NEW_LINE); sb.append("Y: ").append(seriesInfo.getFormattedYValue()).append(StringUtil.NEW_LINE); if (seriesInfo.seriesName != null) { final int start = sb.length(); sb.append(seriesInfo.seriesName); sb.setSpan(new ForegroundColorSpan(ColorUtil.White), start, sb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); sb.append(StringUtil.NEW_LINE); } sb.append(modifierName); setText(sb); // stroke 0xff4d81dd setSeriesColor(0xff6495ed); }
private CharSequence getMessagePreview(LocalMessage message) { String subject = message.getSubject(); String snippet = getPreview(message); boolean isSubjectEmpty = TextUtils.isEmpty(subject); boolean isSnippetPresent = snippet != null; if (isSubjectEmpty && isSnippetPresent) { return snippet; } String displaySubject = getMessageSubject(message); SpannableStringBuilder preview = new SpannableStringBuilder(); preview.append(displaySubject); if (isSnippetPresent) { preview.append('\n'); preview.append(snippet); } return preview; }
public MongolTextView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MongolTextView, defStyleAttr, 0); boolean isEditText = getDefaultEditable(); String text = a.getString(R.styleable.MongolTextView_text); if (text == null) text = ""; if (isEditText) { SpannableStringBuilder ssb = new SpannableStringBuilder(text); mTextStorage = new MongolTextStorage(ssb); } else { mTextStorage = new MongolTextStorage(text); } mTextSizePx = a.getDimensionPixelSize(R.styleable.MongolTextView_textSize, 0); mTextColor = a.getColor(R.styleable.MongolTextView_textColor, Color.BLACK); mGravity = a.getInteger(R.styleable.MongolTextView_gravity, Gravity.TOP); a.recycle(); mContext = context; init(); }
public void setPrimaryMessageBody(@NonNull Recipients threadRecipients, @NonNull Recipient individualRecipient, @NonNull CharSequence message, @Nullable SlideDeck slideDeck) { SpannableStringBuilder stringBuilder = new SpannableStringBuilder(); if (privacy.isDisplayContact() && (threadRecipients.isGroupRecipient() || !threadRecipients.isSingleRecipient())) { stringBuilder.append(Util.getBoldedString(individualRecipient.toShortString() + ": ")); } if (privacy.isDisplayMessage()) { setContentText(stringBuilder.append(message)); this.slideDeck = slideDeck; } else { setContentText(stringBuilder.append(context.getString(R.string.SingleRecipientNotificationBuilder_new_message))); } }
@Override public void handleTagNode(TagNode node, SpannableStringBuilder builder, int start, int end, SpanStack stack) { String src = node.getAttributeByName("src"); builder.append("\uFFFC"); Bitmap bitmap = loadBitmap(src); if (bitmap != null) { Drawable drawable = new BitmapDrawable(bitmap); drawable.setBounds(0, 0, bitmap.getWidth() - 1, bitmap.getHeight() - 1); stack.pushSpan( new ImageSpan(drawable), start, builder.length() ); } }
public void setView(Context mContext, final View view, String content) { if (view != null && view instanceof ImageView) {//图片不显示GIF Bitmap bitmap = null; try { bitmap = BitmapFactory.decodeStream(mContext.getAssets().open(content)); } catch (IOException e1) { e1.printStackTrace(); } ((ImageView) view).setImageBitmap(bitmap); } else if (view != null && view instanceof TextView) {//文字可显示GIF TextView gifTextView = (TextView) view; String tempText = "[" + content + "]"; SpannableStringBuilder sb = prase(mContext, gifTextView, tempText); gifTextView.setText(sb); } }
public static SpannableStringBuilder getTeaser(Context ctx, Spanned body) { if (body.length() < TEASER_LENGTH) throw new IllegalArgumentException( "String is shorter than TEASER_LENGTH"); SpannableStringBuilder builder = new SpannableStringBuilder(body.subSequence(0, TEASER_LENGTH)); String ellipsis = ctx.getString(R.string.ellipsis); builder.append(ellipsis).append(" "); Spannable readMore = new SpannableString( ctx.getString(R.string.read_more) + ellipsis); ForegroundColorSpan fg = new ForegroundColorSpan( ContextCompat.getColor(ctx, R.color.briar_text_link)); readMore.setSpan(fg, 0, readMore.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); builder.append(readMore); return builder; }
/** * 匹配 电话号码 */ protected void patternPhone(SpannableStringBuilder builder, CharSequence input) { Matcher matcher = patternPhone.matcher(input); while (matcher.find()) { int start = matcher.start(); int end = matcher.end(); if (!isInOtherSpan(builder, input.length(), start, end)) { builder.setSpan(new ImageTextSpan(getContext(), ImageTextSpan.initDrawable(getTextSize()), matcher.group(), matcher.group()) .setOnImageSpanClick(mOnImageSpanClick) .setTextColor(mImageSpanTextColor), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } } }
/** * Add spaces around spans until the text is fixed, and then removes the unneeded spaces */ private void fixSpannedWithSpaces(SpannableStringBuilder builder, int widthMeasureSpec, int heightMeasureSpec) { long startFix = System.currentTimeMillis(); FixingResult result = addSpacesAroundSpansUntilFixed(builder, widthMeasureSpec, heightMeasureSpec); if (result.fixed) { removeUnneededSpaces(widthMeasureSpec, heightMeasureSpec, builder, result); } else { fallbackToString(widthMeasureSpec, heightMeasureSpec); } if (HtmlTextView.DEBUG) { long fixDuration = System.currentTimeMillis() - startFix; Log.d(HtmlTextView.TAG, "fixSpannedWithSpaces() duration in ms: " + fixDuration); } }
@Override public void setText(CharSequence text, BufferType type) { if (isInEditMode()) { super.setText(text, type); return; } if (TextUtils.isEmpty(text)) { super.setText(text, type); } else { SpannableStringBuilder spanBuilder = new SpannableStringBuilder(text); if (needPatternUrl) { patternUrl(spanBuilder, text);//优先匹配 } if (needPatternMention) { patternMention(spanBuilder, text); } if (needPatternPhone) { patternPhone(spanBuilder, text); } afterPattern(spanBuilder, text); super.setText(spanBuilder, type); } }
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (mRootView != null) { return mRootView; } mRootView = inflater.inflate(R.layout.ellipse_demo, container, false); SpannableStringBuilder spannableStringBuilder = getSpannable(); FastTextView fastTextView = (FastTextView) mRootView.findViewById(R.id.fast_tv2); fastTextView.setText(spannableStringBuilder); // fastTextView.setCustomEllipsisSpan(new ImageSpan(drawable)); TextView tv = (TextView) mRootView.findViewById(R.id.system_tv); tv.setText(spannableStringBuilder); // tv.setMovementMethod(LinkMovementMethod.getInstance()); return mRootView; }
private void updateView() { if (!isResumed()) return; final String bitcoinRequest = determineBitcoinRequestStr(true); final byte[] paymentRequest = determinePaymentRequest(true); // update qr-code qrCodeBitmap = new BitmapDrawable(getResources(), Qr.bitmap(bitcoinRequest)); qrCodeBitmap.setFilterBitmap(false); qrView.setImageDrawable(qrCodeBitmap); // update initiate request message final SpannableStringBuilder initiateText = new SpannableStringBuilder( getString(R.string.request_coins_fragment_initiate_request_qr)); if (nfcAdapter != null && nfcAdapter.isEnabled()) initiateText.append(' ').append(getString(R.string.request_coins_fragment_initiate_request_nfc)); initiateRequestView.setText(initiateText); // focus linking final int activeAmountViewId = amountCalculatorLink.activeTextView().getId(); acceptBluetoothPaymentView.setNextFocusUpId(activeAmountViewId); paymentRequestRef.set(paymentRequest); }
@Override public void configurePinnedHeader(View headerView, int position, int alpaha) { // TODO Auto-generated method stub TextView label = (TextView) headerView.findViewById(R.id.textLabel); NSIndexPath ip = getIndexPath(position); curSection = ip.getSection(); String t = mTableView.getDataSource().titleForHeaderInSection( mTableView, curSection); if (t != null) { label.setText(t); } else { SpannableStringBuilder buider = mTableView.getDataSource() .spannerbleTitleForHeaderInSection(mTableView, curSection); label.setText(buider); } // huanghai label.setTextColor(Color.BLACK); label.setGravity(Gravity.CENTER_VERTICAL); }
public SpannableStringBuilder getColoredChattingRecord(String filterStr, MessageContent messageContent) { SpannableStringBuilder messageText = new SpannableStringBuilder(); if (messageContent instanceof TextMessage) { TextMessage textMessage = (TextMessage) messageContent; String textMessageContent = textMessage.getContent(); messageText = getOmitColored(filterStr, textMessageContent, 0); } if (messageContent instanceof RichContentMessage) { RichContentMessage richContentMessage = (RichContentMessage) messageContent; String messageTitle = richContentMessage.getTitle(); messageText = getOmitColored(filterStr, messageTitle, 1); if (messageText.length() == 0) { SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder("[链接] "); spannableStringBuilder.append(messageTitle); messageText = spannableStringBuilder; } } if (messageContent instanceof FileMessage) { FileMessage fileMessage = (FileMessage) messageContent; String fileName = fileMessage.getName(); messageText = getOmitColored(filterStr, fileName, 2); } return messageText; }
@Override protected void internalUpdate(XySeriesInfo seriesInfo) { final SpannableStringBuilder sb = new SpannableStringBuilder(); sb.append(modifierName).append(StringUtil.NEW_LINE); if (seriesInfo.seriesName != null) { sb.append(seriesInfo.seriesName); sb.setSpan(new ForegroundColorSpan(ColorUtil.Black), 0, sb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); sb.append(StringUtil.NEW_LINE); } sb.append("X: ").append(seriesInfo.getFormattedXValue()); sb.append(" Y: ").append(seriesInfo.getFormattedYValue()); setText(sb); // stroke 0xffff4500 setSeriesColor(0xffe2460c); }
@NonNull private CharSequence makeThreeOrMoreItems() { if (separator == null) { throw new LexNoSeparatorException(); } SpannableStringBuilder sb = new SpannableStringBuilder(getWrappedItem(0)); for (int i = 1; i < items.length; i++) { if (i == items.length - 1 && lastItemSeparator != null) { sb.append(lastItemSeparator); } else { sb.append(separator); } sb.append(getWrappedItem(i)); } return sb; }
private void disableOnlyFullAppPrefs() { String fullOnly = " FULL ONLY "; int color = Utils.adjustAlpha(CurrentTheme.getColorAccent(getActivity()), 100); for (String name : AppPrefs.ONLY_FULL_APP_PREFS) { Preference preference = findPreference(name); if (preference != null) { preference.setEnabled(false); CharSequence summary = TextUtils.isEmpty(preference.getTitle()) ? "" : preference.getTitle(); summary = fullOnly + " " + summary; Spannable spannable = SpannableStringBuilder.valueOf(summary); BackgroundColorSpan span = new BackgroundColorSpan(color); ForegroundColorSpan span1 = new ForegroundColorSpan(Color.WHITE); spannable.setSpan(span, 0, fullOnly.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); spannable.setSpan(span1, 0, fullOnly.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); preference.setTitle(spannable); } } }
public void addMessageBody(@NonNull Recipients threadRecipients, @NonNull Recipient individualRecipient, @Nullable CharSequence messageBody) { SpannableStringBuilder stringBuilder = new SpannableStringBuilder(); if (privacy.isDisplayContact() && (threadRecipients.isGroupRecipient() || !threadRecipients.isSingleRecipient())) { stringBuilder.append(Util.getBoldedString(individualRecipient.toShortString() + ": ")); } if (privacy.isDisplayMessage()) { messageBodies.add(stringBuilder.append(messageBody == null ? "" : messageBody)); } else { messageBodies.add(stringBuilder.append(context.getString(R.string.SingleRecipientNotificationBuilder_new_message))); } }
public void setHint(@NonNull String hint, @Nullable CharSequence subHint) { this.hint = new SpannableString(hint); this.hint.setSpan(new RelativeSizeSpan(0.8f), 0, hint.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); if (subHint != null) { this.subHint = new SpannableString(subHint); this.subHint.setSpan(new RelativeSizeSpan(0.8f), 0, subHint.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); } else { this.subHint = null; } if (this.subHint != null) { super.setHint(new SpannableStringBuilder().append(ellipsizeToWidth(this.hint)) .append("\n") .append(ellipsizeToWidth(this.subHint))); } else { super.setHint(ellipsizeToWidth(this.hint)); } }
public void setText(Recipients recipients, boolean read) { int attributes[] = new int[]{R.attr.conversation_list_item_count_color}; TypedArray colors = getContext().obtainStyledAttributes(attributes); String fromString = recipients.toShortString(); int typeface; if (!read) { typeface = Typeface.BOLD; } else { typeface = Typeface.NORMAL; } SpannableStringBuilder builder = new SpannableStringBuilder(fromString); builder.setSpan(new StyleSpan(typeface), 0, builder.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); colors.recycle(); setText(builder); if (recipients.isBlocked()) setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_block_grey600_18dp, 0, 0, 0); else if (recipients.isMuted()) setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_volume_off_grey600_18dp, 0, 0, 0); else setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); }
/** * 生成富文本 * * @return Spanned */ private CharSequence generateRichText() { TextView textView = textViewSoftReference.get(); if (textView == null) { return null; } if (config.richType != RichType.MARKDOWN) { analyzeImages(config.source); } else { imageHolderMap = new HashMap<>(); } SpannableStringBuilder spannableStringBuilder = null; if (config.cacheType > CacheType.NONE) { spannableStringBuilder = RichTextPool.getPool().loadCache(config.source); } if (spannableStringBuilder == null) { spannableStringBuilder = parseRichText(); } richText = new SoftReference<>(spannableStringBuilder); config.imageGetter.registerImageLoadNotify(this); cachedSpannedParser.setAccentColor(getAccentColor(textView.getContext())); count = cachedSpannedParser.parse(spannableStringBuilder, this, config); return spannableStringBuilder; }
/** * */ protected SpannableString buildActionTitle() { int dimensionPixelSize = mActionBarActivity.getResources().getDimensionPixelSize(R.dimen.BigTextSize); int mutIndex = 0; String format = "%s"; if(isMute) { format = format + " #"; mutIndex += 2; } SpannableString spannableString = new SpannableString(mTitleText); //EmoticonUtil.getTextFormat(mActionBarActivity, String.format(format, new Object[]{mTitleText}), dimensionPixelSize); if(isMute) { if(mMuteIcon == null) { mMuteIcon = getTitleIconTips(dimensionPixelSize, R.drawable.chat_mute_notify_title_icon); } int length = spannableString.length() - mutIndex + 1; spannableString.setSpan(mMuteIcon, length, length + 1, SpannableStringBuilder.SPAN_POINT_MARK); } return spannableString; }
/** * Build a custom error text */ private SpannableStringBuilder createErrorText(@NonNull String errorString) { ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.RED); SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(errorString); spannableStringBuilder.setSpan(foregroundColorSpan, 0, errorString.length(), 0); return spannableStringBuilder; }
private static SpannableStringBuilder getUrlTextSpannableString(Context context, String source, int size) { SpannableStringBuilder builder = new SpannableStringBuilder(source); String prefix = " "; builder.replace(0, prefix.length(), prefix); Drawable drawable = context.getResources().getDrawable(R.mipmap.ic_status_link); drawable.setBounds(0, 0, size, size); builder.setSpan(new VerticalImageSpan(drawable), prefix.length(), source.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); builder.append(App.getInstance().getString(R.string.text_url_link)); return builder; }
@Override public void removeSpan(Object what) { if (!(mUnicodeText instanceof Spanned)) { return; } if (!(mUnicodeText instanceof SpannableStringBuilder)) { return; } ((SpannableStringBuilder) mUnicodeText).removeSpan(what); ((SpannableStringBuilder) mGlyphText).removeSpan(what); final int length = mUnicodeText.length(); if (mChangelistener != null) mChangelistener.onSpanChanged((Spanned) mUnicodeText, what, 0, 0, length, length); }
private JumpingBeansSpan[] getJumpingBeansSpans(SpannableStringBuilder sbb) { JumpingBeansSpan[] spans; if (waveCharDelay == -1) { waveCharDelay = loopDuration / (3 * (endPos - startPos)); } spans = new JumpingBeansSpan[endPos - startPos]; for (int pos = startPos; pos < endPos; pos++) { JumpingBeansSpan jumpingBean = new JumpingBeansSpan(textView, loopDuration, pos - startPos, waveCharDelay, animRange); sbb.setSpan(jumpingBean, pos, pos + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); spans[pos - startPos] = jumpingBean; } return spans; }
android.text.Spannable build(SpannableStringBuilder builder) { if (nodes != null) { for (Object child : nodes) { if (child instanceof Span) { ((Span) child).build(builder); } else { builder.append(child.toString()); } } } return builder; }
private static SpannableStringBuilder removeNewlines(SpannableStringBuilder s) { int start = 0; int end = s.length(); while (start < end && Character.isWhitespace(s.charAt(start))) { start++; } while (end > start && Character.isWhitespace(s.charAt(end - 1))) { end--; } return (SpannableStringBuilder) s.subSequence(start, end); }
/** * 在text左边或者右边添加icon, * 默认TextView添加leftDrawable或rightDrawable不能适应TextView match_parent的情况 * * @param left true 则在文字左边添加 icon,false 则在文字右边添加 icon * @param text 文字内容 * @param icon 需要被添加的 icon * @return 返回带有 icon 的文字 */ public static CharSequence generateSideIconText(boolean left, int iconPadding, CharSequence text, Drawable icon) { if (icon == null) { return text; } icon.setBounds(0, 0, icon.getIntrinsicWidth(), icon.getIntrinsicHeight()); String iconTag = "[icon]"; SpannableStringBuilder builder = new SpannableStringBuilder(); int start, end; if (left) { start = 0; builder.append(iconTag); end = builder.length(); builder.append(text); } else { builder.append(text); start = builder.length(); builder.append(iconTag); end = builder.length(); } QMUIMarginImageSpan imageSpan; if (left) { imageSpan = new QMUIMarginImageSpan(icon, QMUIAlignMiddleImageSpan.ALIGN_MIDDLE, 0, iconPadding); } else { imageSpan = new QMUIMarginImageSpan(icon, QMUIAlignMiddleImageSpan.ALIGN_MIDDLE, iconPadding, 0); } builder.setSpan(imageSpan, start, end, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); imageSpan.setAvoidSuperChangeFontMetrics(true); return builder; }
@Override public void setFilters(InputFilter[] filters) { if (!(mUnicodeText instanceof SpannableStringBuilder)) { return; } // TODO: this is untested! int oldLength = mUnicodeText.length(); ((SpannableStringBuilder) mUnicodeText).setFilters(filters); ((SpannableStringBuilder) mGlyphText).setFilters(filters); if (mChangelistener != null) mChangelistener.onTextChanged(mUnicodeText, 0, oldLength, mUnicodeText.length()); }
@Override protected boolean updateInternal(AxisInfo axisInfo) { final SpannableStringBuilder sb = new SpannableStringBuilder(); sb.append("Axis ID: ").append(axisInfo.axisId).append(StringUtil.NEW_LINE); sb.append("Value: ").append(axisInfo.axisFormattedDataValue); setText(sb); return true; }
public CharSequence formatAll(OrgRange time) { SpannableStringBuilder s = new SpannableStringBuilder(); s.append(formatAll(time.getStartTime())); if (time.getEndTime() != null) { s.append(" — "); s.append(formatAll(time.getEndTime())); } return s; }
@Override protected void performApplySpans(SpannableStringBuilder builder, int begin, int end, boolean isEditable) { mFontStylingSpan.freeze(); // All spans will automatically extend to the right of the text, but not the left - except // for spans that start at the beginning of the text. final int flag; if (isEditable) { flag = Spannable.SPAN_EXCLUSIVE_EXCLUSIVE; } else { flag = begin == 0 ? Spannable.SPAN_INCLUSIVE_INCLUSIVE : Spannable.SPAN_EXCLUSIVE_INCLUSIVE; } builder.setSpan( mFontStylingSpan, begin, end, flag); if (mShadowStyleSpan.getColor() != 0 && mShadowStyleSpan.getRadius() != 0) { mShadowStyleSpan.freeze(); builder.setSpan( mShadowStyleSpan, begin, end, flag); } for (int i = 0, childCount = getChildCount(); i < childCount; ++i) { FlatTextShadowNode child = (FlatTextShadowNode) getChildAt(i); child.applySpans(builder, isEditable); } }
private static SpannableStringBuilder fromMD(String content) { if(content == null) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) return (SpannableStringBuilder) Html.fromHtml("<b>No content available</b>", Html.FROM_HTML_MODE_COMPACT | Html.FROM_HTML_OPTION_USE_CSS_COLORS | Html.FROM_HTML_SEPARATOR_LINE_BREAK_LIST); else return (SpannableStringBuilder) Html.fromHtml("<b>No content available</b>"); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) return (SpannableStringBuilder) Html.fromHtml(Processor.process(content), Html.FROM_HTML_MODE_COMPACT | Html.FROM_HTML_OPTION_USE_CSS_COLORS | Html.FROM_HTML_SEPARATOR_LINE_BREAK_LIST); else return (SpannableStringBuilder) Html.fromHtml(Processor.process(content)); }
@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); }
@Override public void setCompanyName(String name) { String companyName = getString(R.string.company_name) + "\n" + name; Spannable spannable = new SpannableStringBuilder(companyName); spannable.setSpan(new StyleSpan(Typeface.BOLD), 0, companyName.length() - name.length() - 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); spannable.setSpan(new StyleSpan(Typeface.NORMAL), companyName.length() - name.length(), companyName.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); textViewCompanyName.setText(spannable); }
@Override public void setCompanyWebsite(String website) { this.website = website; String ws = getString(R.string.official_website) + "\n" + website; Spannable spannable = new SpannableStringBuilder(ws); spannable.setSpan(new StyleSpan(Typeface.BOLD), 0, ws.length() - website.length() - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); spannable.setSpan(new URLSpan(website), ws.length() - website.length(), ws.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); textViewWebsite.setText(spannable); }