android.text.SpannableStringBuilder#getSpanEnd ( )源码实例Demo

下面列出了android.text.SpannableStringBuilder#getSpanEnd ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。

/**
 * Link clickable.
 *
 * @param strBuilder
 *   A string builder.
 * @param span
 *   The span with url.
 */
private void makeLinkClickable(SpannableStringBuilder strBuilder, final URLSpan span) {
    int start = strBuilder.getSpanStart(span);
    int end = strBuilder.getSpanEnd(span);
    int flags = strBuilder.getSpanFlags(span);
    ClickableSpan clickable = new ClickableSpan() {
        public void onClick(@NonNull View view) {
            try {
                CustomTabsIntent.Builder intentBuilder = new CustomTabsIntent.Builder();
                intentBuilder.setToolbarColor(ContextCompat.getColor(TimelineDetailActivity.this, R.color.colorPrimary));
                intentBuilder.setSecondaryToolbarColor(ContextCompat.getColor(TimelineDetailActivity.this, R.color.colorPrimaryDark));
                CustomTabsIntent customTabsIntent = intentBuilder.build();
                customTabsIntent.intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                customTabsIntent.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                customTabsIntent.launchUrl(TimelineDetailActivity.this, Uri.parse(span.getURL()));
            }
            catch (Exception ignored) { }
        }
    };
    strBuilder.setSpan(clickable, start, end, flags);
    strBuilder.removeSpan(span);
}
 
源代码2 项目: indigenous-android   文件: TimelineListAdapter.java
/**
 * Link clickable.
 *
 * @param strBuilder
 *   A string builder.
 * @param span
 *   The span with url.
 */
private void makeLinkClickable(SpannableStringBuilder strBuilder, final URLSpan span) {
    int start = strBuilder.getSpanStart(span);
    int end = strBuilder.getSpanEnd(span);
    int flags = strBuilder.getSpanFlags(span);
    ClickableSpan clickable = new ClickableSpan() {
        public void onClick(View view) {
            try {
                CustomTabsIntent.Builder intentBuilder = new CustomTabsIntent.Builder();
                intentBuilder.setToolbarColor(ContextCompat.getColor(context, R.color.colorPrimary));
                intentBuilder.setSecondaryToolbarColor(ContextCompat.getColor(context, R.color.colorPrimaryDark));
                CustomTabsIntent customTabsIntent = intentBuilder.build();
                customTabsIntent.intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                customTabsIntent.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                customTabsIntent.launchUrl(context, Uri.parse(span.getURL()));
            }
            catch (Exception ignored) { }
        }
    };
    strBuilder.setSpan(clickable, start, end, flags);
    strBuilder.removeSpan(span);
}
 
源代码3 项目: Dashchan   文件: InteractionUnit.java
String getCopyReadyComment(CharSequence text, int start, int end) {
	if (text instanceof Spanned) {
		SpannableStringBuilder builder = new SpannableStringBuilder(text.subSequence(start, end));
		LinkSuffixSpan[] spans = builder.getSpans(0, builder.length(), LinkSuffixSpan.class);
		if (spans != null && spans.length > 0) {
			for (LinkSuffixSpan span : spans) {
				int spanStart = builder.getSpanStart(span);
				int spanEnd = builder.getSpanEnd(span);
				builder.delete(spanStart, spanEnd);
			}
		}
		return builder.toString();
	} else {
		return text.subSequence(start, end).toString();
	}
}
 
源代码4 项目: quill   文件: AppUtils.java
public static void setHtmlWithLinkClickHandler(TextView tv, String html,
                                        Action1<String> linkClickHandler) {
    CharSequence sequence = Html.fromHtml(html);
    SpannableStringBuilder strBuilder = new SpannableStringBuilder(sequence);
    URLSpan[] urls = strBuilder.getSpans(0, sequence.length(), URLSpan.class);
    for (URLSpan span : urls) {
        int start = strBuilder.getSpanStart(span);
        int end = strBuilder.getSpanEnd(span);
        int flags = strBuilder.getSpanFlags(span);
        ClickableSpan clickable = new ClickableSpan() {
            public void onClick(View view) {
                linkClickHandler.call(span.getURL());
            }
        };
        strBuilder.setSpan(clickable, start, end, flags);
        strBuilder.removeSpan(span);
    }
    tv.setText(strBuilder);
    tv.setMovementMethod(LinkMovementMethod.getInstance());
}
 
源代码5 项目: talk-android   文件: MessageFormatter.java
public static Spannable formatHighlightSpan(String html, Resources res) {
    HighlightSpan highlightSpan;
    if (Html.fromHtml(html) instanceof SpannableStringBuilder) {
        SpannableStringBuilder value = (SpannableStringBuilder) Html.fromHtml(html);
        StyleSpan[] spans = value.getSpans(0, html.length(), StyleSpan.class);
        for (StyleSpan span : spans) {
            int start = value.getSpanStart(span);
            int end = value.getSpanEnd(span);
            value.removeSpan(span);
            highlightSpan = new HighlightSpan(res);
            value.setSpan(highlightSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        return value;
    } else {
        return new SpannableStringBuilder(html);
    }
}
 
源代码6 项目: BigApp_Discuz_Android   文件: AdapterActManage.java
private void setLinkClickable(final SpannableStringBuilder clickableHtmlBuilder,
                              final URLSpan urlSpan) {
    int start = clickableHtmlBuilder.getSpanStart(urlSpan);
    int end = clickableHtmlBuilder.getSpanEnd(urlSpan);
    int flags = clickableHtmlBuilder.getSpanFlags(urlSpan);
    clickableHtmlBuilder.setSpan(new ClickableSpan() {
        public void onClick(View view) {
            try {
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setData(Uri.parse(urlSpan.getURL()));
                context.startActivity(intent);
            } catch (Throwable e) {
                e.printStackTrace();
            }
        }
    }, start, end, flags);
}
 
源代码7 项目: android-proguards   文件: ImageSpanTarget.java
@Override
public void onResourceReady(Bitmap bitmap, GlideAnimation<? super Bitmap> glideAnimation) {
    TextView tv = textView.get();
    if (tv != null) {
        BitmapDrawable bitmapDrawable = new BitmapDrawable(tv.getResources(), bitmap);
        // image span doesn't handle scaling so we manually set bounds
        if (bitmap.getWidth() > tv.getWidth()) {
            float aspectRatio = (float) bitmap.getHeight() / (float) bitmap.getWidth();
            bitmapDrawable.setBounds(0, 0, tv.getWidth(), (int) (aspectRatio * tv.getWidth()));
        } else {
            bitmapDrawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight());
        }
        ImageSpan span = new ImageSpan(bitmapDrawable);
        // add the image span and remove our marker
        SpannableStringBuilder ssb = new SpannableStringBuilder(tv.getText());
        int start = ssb.getSpanStart(loadingSpan);
        int end = ssb.getSpanEnd(loadingSpan);
        if (start >= 0 && end >= 0) {
            ssb.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        ssb.removeSpan(loadingSpan);
        // animate the change
        TransitionManager.beginDelayedTransition((ViewGroup) tv.getParent());
        tv.setText(ssb);
    }
}
 
源代码8 项目: Dashchan   文件: InterfaceFragment.java
@Override
public void onPreferenceAfterChange(Preference preference) {
	super.onPreferenceAfterChange(preference);
	if (preference == advancedSearchPreference && advancedSearchPreference.isChecked()) {
		SpannableStringBuilder builder = new SpannableStringBuilder
				(getText(R.string.preference_advanced_search_message));
		Object[] spans = builder.getSpans(0, builder.length(), Object.class);
		for (Object span : spans) {
			int start = builder.getSpanStart(span);
			int end = builder.getSpanEnd(span);
			int flags = builder.getSpanFlags(span);
			builder.removeSpan(span);
			builder.setSpan(new TypefaceSpan("sans-serif-medium"), start, end, flags);
		}
		MessageDialog.create(this, builder, false);
	}
}
 
源代码9 项目: droidddle   文件: GoURLSpan.java
/**
 * @param spanText
 * @return true if have url
 */
public static final boolean hackURLSpanHasResult(SpannableStringBuilder spanText) {
    boolean result = false;
    URLSpan[] spans = spanText.getSpans(0, spanText.length(), URLSpan.class);
    // TODO URLSpan need change to ClickableSpan (GoURLSpan) , otherwise URLSpan can not click, not display underline.WHY?
    for (URLSpan span : spans) {
        int start = spanText.getSpanStart(span);
        int end = spanText.getSpanEnd(span);
        String url = span.getURL();
        if (url != null) {
            result = true;
            spanText.removeSpan(span);
            ClickableSpan span1 = new GoURLSpan(span.getURL());
            spanText.setSpan(span1, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }

    return result;
}
 
源代码10 项目: kaif-android   文件: DefaultDecorator.java
private static <T> void end(SpannableStringBuilder text, Class<T> kind, Object repl) {
  int len = text.length();
  T obj = getLast(text, kind);
  int where = text.getSpanStart(obj);
  text.removeSpan(obj);

  Object[] nestSpans = text.getSpans(where, len, Object.class);
  List<NestSpanInfo> spans = new ArrayList<>();
  for (Object nestSpan : nestSpans) {
    int spanStart = text.getSpanStart(nestSpan);
    int spanEnd = text.getSpanEnd(nestSpan);
    int spanFlags = text.getSpanFlags(nestSpan);
    text.removeSpan(nestSpan);
    spans.add(new NestSpanInfo(nestSpan, spanStart, spanEnd, spanFlags));
  }

  if (where != len) {
    text.setSpan(repl, where, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
  }
  //reorder spans
  for (NestSpanInfo span : spans) {
    text.setSpan(span.span, span.start, span.end, span.flag);
  }
}
 
源代码11 项目: v2ex   文件: JellyBeanSpanFixTextView.java
private FixingResult addSpacesAroundSpansUntilFixed(SpannableStringBuilder builder,
                                                    int widthMeasureSpec, int heightMeasureSpec) {

    Object[] spans = builder.getSpans(0, builder.length(), Object.class);
    List<Object> spansWithSpacesBefore = new ArrayList<Object>(spans.length);
    List<Object> spansWithSpacesAfter = new ArrayList<Object>(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 notFixed) {
        }
    }
    if (HtmlTextView.DEBUG) {
        Log.d(HtmlTextView.TAG, "Could not fix the Spanned by adding spaces around spans");
    }
    return FixingResult.notFixed();
}
 
源代码12 项目: PhoneProfilesPlus   文件: GlobalGUIRoutines.java
private static SpannableStringBuilder addBullets(Spanned htmlSpanned) {
    SpannableStringBuilder spannableBuilder = new SpannableStringBuilder(htmlSpanned);
    BulletSpan[] spans = spannableBuilder.getSpans(0, spannableBuilder.length(), BulletSpan.class);
    if (spans != null) {
        for (BulletSpan span : spans) {
            int start = spannableBuilder.getSpanStart(span);
            int end  = spannableBuilder.getSpanEnd(span);
            spannableBuilder.removeSpan(span);
            spannableBuilder.setSpan(new ImprovedBulletSpan(dip(2), dip(8), 0), start, end, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        }
    }
    return spannableBuilder;
}
 
源代码13 项目: GDPRDialog   文件: GDPRViewManager.java
private void makeLinkClickable(SpannableStringBuilder strBuilder, final URLSpan span, Runnable runnable) {
    int start = strBuilder.getSpanStart(span);
    int end = strBuilder.getSpanEnd(span);
    int flags = strBuilder.getSpanFlags(span);
    ClickableSpan clickable = new ClickableSpan() {
        public void onClick(View view) {
            runnable.run();
        }
    };
    strBuilder.setSpan(clickable, start, end, flags);
    strBuilder.removeSpan(span);
}
 
源代码14 项目: memoir   文件: ConverterHtmlToSpanned.java
void swapIn(SpannableStringBuilder builder) {
    int start = builder.getSpanStart(this);
    int end = builder.getSpanEnd(this);
    builder.removeSpan(this);
    if (start >= 0 && end > start && end <= builder.length()) {
        builder.setSpan(mSpan, start, end, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
    }
}
 
源代码15 项目: memoir   文件: ConverterHtmlToSpanned.java
void swapIn(SpannableStringBuilder builder) {
    int start = builder.getSpanStart(this);
    int end = builder.getSpanEnd(this);
    builder.removeSpan(this);
    if (start >= 0 && end > start && end <= builder.length()) {
        builder.setSpan(mSpan, start, end, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
    }
}
 
源代码16 项目: 365browser   文件: ChartDataUsageView.java
private static void setText(
        SpannableStringBuilder builder, Object key, CharSequence text, String bootstrap) {
    int start = builder.getSpanStart(key);
    int end = builder.getSpanEnd(key);
    if (start == -1) {
        start = TextUtils.indexOf(builder, bootstrap);
        end = start + bootstrap.length();
        builder.setSpan(key, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
    }
    builder.replace(start, end, text);
}
 
源代码17 项目: Markdown   文件: TagHandlerImpl.java
private boolean checkInCode(SpannableStringBuilder builder, int start, int end) {
    CodeSpan[] css = builder.getSpans(0, builder.length(), CodeSpan.class);
    for (CodeSpan cs : css) {
        int c_start = builder.getSpanStart(cs);
        int c_end = builder.getSpanEnd(cs);
        if (!(c_start >= end || c_end <= start)) {
            return true;
        }
    }
    return false;
}
 
源代码18 项目: RichEditor   文件: Style.java
@Override
public void beforeStyle(SpannableStringBuilder ssb, int start, int end) {
    HeadSpan[] headSpans = ssb.getSpans(start, end, HeadSpan.class);
    for (HeadSpan headSpan : headSpans) {
        int s = ssb.getSpanStart(headSpan);
        int e = ssb.getSpanEnd(headSpan);
        ssb.removeSpan(headSpan);
        ssb.setSpan(headSpan, s, e, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    }
}
 
源代码19 项目: Android-RTEditor   文件: ConverterHtmlToSpanned.java
void swapIn(SpannableStringBuilder builder) {
    int start = builder.getSpanStart(this);
    int end = builder.getSpanEnd(this);
    builder.removeSpan(this);
    if (start >= 0 && end > start && end <= builder.length()) {
        builder.setSpan(mSpan, start, end, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
    }
}
 
源代码20 项目: RichEditor   文件: SpanStep2Filter.java
@Override
public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
    if (charSequence instanceof SpannableStringBuilder) {
        SpannableStringBuilder span = (SpannableStringBuilder) charSequence;
        Object[] spans = span.getSpans(0, span.length(), CharacterStyle.class);
        Iterator iterator = null;
        if (mData.get(position).getSpanList() != null) {
            iterator = mData.get(position).getSpanList().iterator();
        }
        boolean needAdd = false;
        for (int i = 0; i < spans.length; i++) {
            SpanModel model;
            if (iterator != null && iterator.hasNext()) {
                //复用原本的Model,防止重复New
                model = (SpanModel) iterator.next();
                if (model.mSpans != null) {
                    model.mSpans.clear();
                } else {
                    model.mSpans = new ArrayList<>();
                }
            } else {
                RichLog.log("NEW-------------");
                needAdd = true;
                model = new SpanModel();
            }
            model.mSpans.add(spans[i]);
            model.end = span.getSpanEnd(spans[i]);
            model.start = span.getSpanStart(spans[i]);
            for (++i; i < spans.length; i++) {
                if (span.getSpanEnd(spans[i]) == model.end && span.getSpanStart(spans[i]) == model.start) {
                    model.mSpans.add(spans[i]);
                } else {
                    i--;
                    break;
                }
            }
            if (needAdd) {
                mData.get(position).getSpanList().add(model);
            }
        }
        while (!needAdd && iterator != null && iterator.hasNext()) {
            iterator.next();
            iterator.remove();
        }
        for (SpanModel item : mData.get(position).getSpanList()) {
            Log.i(BASE_LOG, item.mSpans + "start:" + item.start + "end:" + item.end);
        }
    }
    mData.get(position).setSource(charSequence.toString());
}