List of usage examples for android.text SpannableStringBuilder SpannableStringBuilder
public SpannableStringBuilder(CharSequence text)
From source file:Main.java
/** * Given a snippet string with matching segments surrounded by curly * braces, turn those areas into bold spans, removing the curly braces. *///from w ww .ja v a 2 s.co m public static Spannable buildStyledSnippet(String snippet) { final SpannableStringBuilder builder = new SpannableStringBuilder(snippet); // Walk through string, inserting bold snippet spans int startIndex = -1, endIndex = -1, delta = 0; while ((startIndex = snippet.indexOf('{', endIndex)) != -1) { endIndex = snippet.indexOf('}', startIndex); // Remove braces from both sides builder.delete(startIndex - delta, startIndex - delta + 1); builder.delete(endIndex - delta - 1, endIndex - delta); // Insert bold style builder.setSpan(sBoldSpan, startIndex - delta, endIndex - delta - 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); delta += 2; } return builder; }
From source file:Main.java
/** * Given either a Spannable String or a regular String and a token, apply * the given CharacterStyle to the span between the tokens, and also remove * tokens./*from w w w . j a v a2 s .c om*/ * <p/> * For example, {@code setSpanBetweenTokens("Hello ##world##!", "##", *new ForegroundColorSpan(0xFFFF0000));} will return a CharSequence * {@code "Hello world!"} with {@code world} in red. * * @param text The text, with the tokens, to adjust. * @param token The token string; there should be at least two instances of * token in text. * @param cs The style to apply to the CharSequence. WARNING: You cannot * send the same two instances of this parameter, otherwise the * second call will remove the original span. * @return A Spannable CharSequence with the new style applied. * @see <a href="http://developer.android.com/reference/android/text/style/CharacterStyle * .html">Character Style</a> */ public static CharSequence setSpanBetweenTokens(CharSequence text, String token, CharacterStyle... cs) { // Start and end refer to the points where the span will apply int tokenLen = token.length(); int start = text.toString().indexOf(token) + tokenLen; int end = text.toString().indexOf(token, start); if (start > -1 && end > -1) { // Copy the spannable string to a mutable spannable string SpannableStringBuilder ssb = new SpannableStringBuilder(text); for (CharacterStyle c : cs) { ssb.setSpan(c, start, end, 0); } // Delete the tokens before and after the span ssb.delete(end, end + tokenLen); ssb.delete(start - tokenLen, start); text = ssb; } return text; }
From source file:Main.java
/** * Make UI TextView a html link./*w w w. ja v a 2 s . com*/ * * @param context the context * @param textView the text view * @param html the html containing link info */ public static void makeTextViewAHTMLLink(final Context context, TextView textView, String html) { textView.setLinksClickable(true); textView.setMovementMethod(LinkMovementMethod.getInstance()); CharSequence sequence = Html.fromHtml(html); SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(sequence); URLSpan[] urls = spannableStringBuilder.getSpans(0, sequence.length(), URLSpan.class); for (final URLSpan urlSpan : urls) { int start = spannableStringBuilder.getSpanStart(urlSpan); int end = spannableStringBuilder.getSpanEnd(urlSpan); int flags = spannableStringBuilder.getSpanFlags(urlSpan); ClickableSpan clickable = new ClickableSpan() { public void onClick(View view) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(urlSpan.getURL())); context.startActivity(intent); } @Override public void updateDrawState(TextPaint textPaint) { super.updateDrawState(textPaint); textPaint.setUnderlineText(false); } }; spannableStringBuilder.removeSpan(urlSpan); spannableStringBuilder.setSpan(clickable, start, end, flags); } textView.setText(spannableStringBuilder); }
From source file:Main.java
public static Spannable replaceTags(String str, Context context) { try {/*ww w . ja va 2s.co m*/ int start = -1; int startColor = -1; int end = -1; StringBuilder stringBuilder = new StringBuilder(str); while ((start = stringBuilder.indexOf("<br>")) != -1) { stringBuilder.replace(start, start + 4, "\n"); } while ((start = stringBuilder.indexOf("<br/>")) != -1) { stringBuilder.replace(start, start + 5, "\n"); } ArrayList<Integer> bolds = new ArrayList<>(); ArrayList<Integer> colors = new ArrayList<>(); while ((start = stringBuilder.indexOf("<b>")) != -1 || (startColor = stringBuilder.indexOf("<c")) != -1) { if (start != -1) { stringBuilder.replace(start, start + 3, ""); end = stringBuilder.indexOf("</b>"); stringBuilder.replace(end, end + 4, ""); bolds.add(start); bolds.add(end); } else if (startColor != -1) { stringBuilder.replace(startColor, startColor + 2, ""); end = stringBuilder.indexOf(">", startColor); int color = Color.parseColor(stringBuilder.substring(startColor, end)); stringBuilder.replace(startColor, end + 1, ""); end = stringBuilder.indexOf("</c>"); stringBuilder.replace(end, end + 4, ""); colors.add(startColor); colors.add(end); colors.add(color); } } SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(stringBuilder); for (int a = 0; a < colors.size() / 3; a++) { spannableStringBuilder.setSpan(new ForegroundColorSpan(colors.get(a * 3 + 2)), colors.get(a * 3), colors.get(a * 3 + 1), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } return spannableStringBuilder; } catch (Exception e) { } return new SpannableStringBuilder(str); }
From source file:Main.java
public static SpannableStringBuilder replaceTags(String str, int flag) { try {//from ww w .j a v a 2s.c o m int start; int end; StringBuilder stringBuilder = new StringBuilder(str); if ((flag & FLAG_TAG_BR) != 0) { while ((start = stringBuilder.indexOf("<br>")) != -1) { stringBuilder.replace(start, start + 4, "\n"); } while ((start = stringBuilder.indexOf("<br/>")) != -1) { stringBuilder.replace(start, start + 5, "\n"); } } ArrayList<Integer> bolds = new ArrayList<>(); if ((flag & FLAG_TAG_BOLD) != 0) { while ((start = stringBuilder.indexOf("<b>")) != -1) { stringBuilder.replace(start, start + 3, ""); end = stringBuilder.indexOf("</b>"); if (end == -1) { end = stringBuilder.indexOf("<b>"); } stringBuilder.replace(end, end + 4, ""); bolds.add(start); bolds.add(end); } } ArrayList<Integer> colors = new ArrayList<>(); if ((flag & FLAG_TAG_COLOR) != 0) { while ((start = stringBuilder.indexOf("<c#")) != -1) { stringBuilder.replace(start, start + 2, ""); end = stringBuilder.indexOf(">", start); int color = Color.parseColor(stringBuilder.substring(start, end)); stringBuilder.replace(start, end + 1, ""); end = stringBuilder.indexOf("</c>"); stringBuilder.replace(end, end + 4, ""); colors.add(start); colors.add(end); colors.add(color); } } SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(stringBuilder); // for (int a = 0; a < bolds.size() / 2; a++) { // spannableStringBuilder.setSpan( // new TypefaceSpan(AndroidUtilities.getTypeface("fonts/rmedium.ttf")), // bolds.get(a * 2), bolds.get(a * 2 + 1), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // } for (int a = 0; a < colors.size() / 3; a++) { spannableStringBuilder.setSpan(new ForegroundColorSpan(colors.get(a * 3 + 2)), colors.get(a * 3), colors.get(a * 3 + 1), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } return spannableStringBuilder; } catch (Exception e) { e.printStackTrace(); } return new SpannableStringBuilder(str); }
From source file:com.keylesspalace.tusky.util.LinkHelper.java
/** * Finds links, mentions, and hashtags in a piece of text and makes them clickable, associating * them with callbacks to notify when they're clicked. * * @param view the returned text will be put in * @param content containing text with mentions, links, or hashtags * @param mentions any '@' mentions which are known to be in the content * @param listener to notify about particular spans that are clicked *//* ww w . j a v a 2 s . c o m*/ public static void setClickableText(TextView view, Spanned content, @Nullable Status.Mention[] mentions, final LinkListener listener) { SpannableStringBuilder builder = new SpannableStringBuilder(content); URLSpan[] urlSpans = content.getSpans(0, content.length(), URLSpan.class); for (URLSpan span : urlSpans) { int start = builder.getSpanStart(span); int end = builder.getSpanEnd(span); int flags = builder.getSpanFlags(span); CharSequence text = builder.subSequence(start, end); if (text.charAt(0) == '#') { final String tag = text.subSequence(1, text.length()).toString(); ClickableSpan newSpan = new ClickableSpan() { @Override public void onClick(View widget) { listener.onViewTag(tag); } @Override public void updateDrawState(TextPaint ds) { super.updateDrawState(ds); ds.setUnderlineText(false); } }; builder.removeSpan(span); builder.setSpan(newSpan, start, end, flags); } else if (text.charAt(0) == '@' && mentions != null && mentions.length > 0) { String accountUsername = text.subSequence(1, text.length()).toString(); /* There may be multiple matches for users on different instances with the same * username. If a match has the same domain we know it's for sure the same, but if * that can't be found then just go with whichever one matched last. */ String id = null; for (Status.Mention mention : mentions) { if (mention.localUsername.equalsIgnoreCase(accountUsername)) { id = mention.id; if (mention.url.contains(getDomain(span.getURL()))) { break; } } } if (id != null) { final String accountId = id; ClickableSpan newSpan = new ClickableSpan() { @Override public void onClick(View widget) { listener.onViewAccount(accountId); } @Override public void updateDrawState(TextPaint ds) { super.updateDrawState(ds); ds.setUnderlineText(false); } }; builder.removeSpan(span); builder.setSpan(newSpan, start, end, flags); } } else { ClickableSpan newSpan = new CustomURLSpan(span.getURL()); builder.removeSpan(span); builder.setSpan(newSpan, start, end, flags); } } view.setText(builder); view.setLinksClickable(true); view.setMovementMethod(LinkMovementMethod.getInstance()); }
From source file:com.freshdigitable.udonroad.CombinedScreenNameTextView.java
public void setNames(User user) { final String name = user.getName(); final String screenName = user.getScreenName(); if (this.name != null && this.name.equals(name) && this.screenName != null && this.screenName.equals(screenName)) { return;/*from w ww . jav a 2s . com*/ } final String formatted = name + (TextViewCompat.getMaxLines(this) == 2 ? "\n" : " ") + "@" + screenName; final SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(formatted); spannableStringBuilder.setSpan(STYLE_BOLD, 0, name.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); setText(spannableStringBuilder); this.name = name; this.screenName = screenName; }
From source file:org.rudirect.android.activity.AttributionsActivity.java
private SpannableStringBuilder getAttributionsMessage() { try {/*from ww w . j a va 2 s. c o m*/ String googlePlayLicense = GoogleApiAvailability.getInstance().getOpenSourceSoftwareLicenseInfo(this); return new SpannableStringBuilder(Html.fromHtml("<h4>Google Play Services</h4>")) .append(googlePlayLicense).append("\n") .append(Html.fromHtml(convertStreamToString(getAssets().open("open_source_software.html")))); } catch (IOException e) { Log.e(TAG, e.toString(), e); return null; } }
From source file:com.github.michalbednarski.intentslab.browser.RegisteredReceiverFetcher.java
@Override Object getEntries(Context context) { try {//w ww .j a v a 2 s. co m final Categorizer<RegisteredReceiverInfo> categorizer = new ProcessCategorizer(); (new RegisteredReceiversParser(mExcludeProtected) { @Override protected void onReceiverFound(RegisteredReceiverInfo receiverInfo) { categorizer.add(receiverInfo); } }).parse(context); return categorizer.getResult(); } catch (SecurityException e) { // Create message about error SpannableStringBuilder ssb = new SpannableStringBuilder( context.getString(R.string.registered_receivers_denied)); ssb.append("\n"); int commandStart = ssb.length(); if (ComponentFetcher.DEVELOPMENT_PERMISSIONS_SUPPORTED) { ssb.append("pm grant ").append(context.getPackageName()).append(" android.permission.DUMP"); } else { ssb.append(RemoteEntryPoint.getScriptFile(context).getAbsolutePath()); } int commandEnd = ssb.length(); ssb.setSpan(new StyleSpan(Typeface.BOLD), commandStart, commandEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); return new CustomError(ssb); } catch (Throwable e) { e.printStackTrace(); return new CustomError(Utils.describeException(e)); } }
From source file:com.yek.keyboard.ui.settings.AboutAnySoftKeyboardFragment.java
@Override public void onViewStateRestored(Bundle savedInstanceState) { super.onViewStateRestored(savedInstanceState); TextView additionalSoftware = (TextView) getView().findViewById(R.id.about_legal_stuff_link); SpannableStringBuilder sb = new SpannableStringBuilder(additionalSoftware.getText()); sb.clearSpans();//removing any previously (from instance-state) set click spans. sb.setSpan(new ClickableSpan() { @Override/*from www . j a v a 2 s. c o m*/ public void onClick(View widget) { FragmentChauffeurActivity activity = (FragmentChauffeurActivity) getActivity(); activity.addFragmentToUi(new AdditionalSoftwareLicensesFragment(), TransitionExperiences.DEEPER_EXPERIENCE_TRANSITION); } }, 0, additionalSoftware.getText().length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); additionalSoftware.setMovementMethod(LinkMovementMethod.getInstance()); additionalSoftware.setText(sb); }