/** * replace existing spannable with smiles * * @param context * @param spannable * @return */ public static boolean addSmiles(Context context, Spannable spannable) { boolean hasChanges = false; for (Entry<Pattern, Integer> 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; spannable.setSpan( new ImageSpan(context, entry.getValue()), matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } } } return hasChanges; }
public static Spannable getSmiledText(Context context, CharSequence text) { Spannable spannable = spannableFactory.newSpannable(text); for (Entry entry : ANDROID_EMOTICONS.entrySet()) { Matcher matcher = ((Pattern) entry.getKey()).matcher(spannable); while (matcher.find()) { for (Object obj : (ImageSpan[]) spannable.getSpans(matcher.start(), matcher.end(), ImageSpan.class)) { if (spannable.getSpanStart(obj) < matcher.start() || spannable.getSpanEnd(obj) > matcher.end()) { Object obj2 = null; break; } spannable.removeSpan(obj); } int i = 1; if (obj2 != null) { spannable.setSpan( new ImageSpan(context, ((Integer) entry.getValue()).intValue()), matcher.start(), matcher.end(), 33); } } } return spannable; }
public boolean addImages(Context context, Spannable spannable) { Pattern refImg = Pattern.compile("\\Q[img src=\\E([a-zA-Z0-9_]+?)\\Q/]\\E"); boolean hasChanges = false; Matcher matcher = refImg.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; } } String resname = spannable.subSequence(matcher.start(1), matcher.end(1)).toString().trim(); int id = context.getResources().getIdentifier(resname, "drawable", context.getPackageName()); Drawable icon = context.getResources().getDrawable(id); // ,this.getTheme()); icon.setBounds(0, 0, tv_test1.getLineHeight(), tv_test1.getLineHeight()); if (set) { hasChanges = true; spannable.setSpan( new ImageSpan(icon, ImageSpan.ALIGN_BASELINE), matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } } return hasChanges; }
@Override public boolean onTouchEvent(TextView textView, Spannable spannable, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { mPressedSpan = getPressedSpan(textView, spannable, event); if (mPressedSpan != null) { mPressedSpan.setPressed(true); Selection.setSelection( spannable, spannable.getSpanStart(mPressedSpan), spannable.getSpanEnd(mPressedSpan)); } } else if (event.getAction() == MotionEvent.ACTION_MOVE) { TouchableSpan touchedSpan = getPressedSpan(textView, spannable, event); if (mPressedSpan != null && touchedSpan != mPressedSpan) { mPressedSpan.setPressed(false); mPressedSpan = null; Selection.removeSelection(spannable); } } else { if (mPressedSpan != null) { mPressedSpan.setPressed(false); super.onTouchEvent(textView, spannable, event); } mPressedSpan = null; Selection.removeSelection(spannable); } return true; }
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); tv = new TextView(this); ctx = this; String htmlLinkText = "我是超链接" + "<a href='lianjie'><font color='red'>超链接点击事件</font></a>"; // 文字的样式(style)被覆盖,不能改变…… tv.setText(Html.fromHtml(htmlLinkText)); tv.setMovementMethod(LinkMovementMethod.getInstance()); CharSequence text = tv.getText(); if (text instanceof Spannable) { int end = text.length(); Spannable sp = (Spannable) tv.getText(); URLSpan[] urls = sp.getSpans(0, end, URLSpan.class); SpannableStringBuilder style = new SpannableStringBuilder(text); style.clearSpans(); // should clear old spans // 循环把链接发过去 for (URLSpan url : urls) { MyURLSpan myURLSpan = new MyURLSpan(url.getURL()); style.setSpan( myURLSpan, sp.getSpanStart(url), sp.getSpanEnd(url), Spannable.SPAN_EXCLUSIVE_INCLUSIVE); } tv.setText(style); } setContentView(tv); }
@Override public boolean onTouchEvent(MotionEvent event) { CharSequence text = getText(); int action = event.getAction(); if (!(text instanceof Spannable)) { return super.onTouchEvent(event); } Spannable buffer = (Spannable) text; if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_MOVE) { TextView widget = this; 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); URLSpan[] link = buffer.getSpans(off, off, URLSpan.class); if (link.length != 0) { if (action == MotionEvent.ACTION_UP) { if (mCurrentLink == link[0]) { link[0].onClick(widget); } mCurrentLink = null; buffer.removeSpan(mLinkFocusStyle); } else if (action == MotionEvent.ACTION_DOWN) { mCurrentLink = link[0]; buffer.setSpan( mLinkFocusStyle, buffer.getSpanStart(link[0]), buffer.getSpanEnd(link[0]), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } return true; } } mCurrentLink = null; buffer.removeSpan(mLinkFocusStyle); return super.onTouchEvent(event); }
public static Spanned toSpanned( final Context context, final String toastString, @ColorRes final int toastColor) { final String string = "" + context.getResources().getColor(toastColor); final Spannable spannable = (Spannable) Html.fromHtml(colorize_a(colorize_em(toastString, string, true), string)); for (final URLSpan urlSpan : (URLSpan[]) spannable.getSpans(0, spannable.length(), (Class) URLSpan.class)) { spannable.setSpan(urlSpan, spannable.getSpanStart(urlSpan), spannable.getSpanEnd(urlSpan), 0); } return spannable; }
private void stripUnderlines(TextView textView) { Spannable s = (Spannable) textView.getText(); URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class); for (URLSpan span : spans) { int start = s.getSpanStart(span); int end = s.getSpanEnd(span); s.removeSpan(span); span = new URLSpanNoUnderline(span.getURL()); s.setSpan(span, start, end, 0); } textView.setText(s); }
/** * 清除textview链接的下划线 * * @param textView */ public static void removeLinkUnderline(TextView textView) { Spannable s = Spannable.Factory.getInstance().newSpannable(textView.getText()); URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class); for (URLSpan span : spans) { int start = s.getSpanStart(span); int end = s.getSpanEnd(span); s.removeSpan(span); span = new TweetURLSpan(span.getURL()); s.setSpan(span, start, end, 0); } textView.setText(s); }
/** * Removes any {@link android.text.style.URLSpan}s from the Spannable and replaces them with a * non-underline version {@link LinkStyleSpan} which calls the supplied listener when clicked. */ public static void stripUnderlinesAndLinkUrls( Spannable input, View.OnClickListener onClickListener) { final URLSpan[] urls = input.getSpans(0, input.length(), URLSpan.class); for (URLSpan span : urls) { final int start = input.getSpanStart(span); final int end = input.getSpanEnd(span); input.removeSpan(span); input.setSpan( new LinkStyleSpan(onClickListener), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } }
public static Spannable changeHyperlinkColor( String content, Html.ImageGetter imageGetter, Html.TagHandler tagHandler, int color) { Spannable s = (Spannable) Html.fromHtml(content, imageGetter, tagHandler); URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class); for (URLSpan span : spans) { int start = s.getSpanStart(span); int end = s.getSpanEnd(span); s.removeSpan(span); span = new URLSpanNoUnderline(span.getURL(), color); s.setSpan(span, start, end, 0); } return s; }
public static Spannable recentMessage( String content, Html.ImageGetter imageGetter, Html.TagHandler tagHandler) { String parse = parseNoMonkeyImage(content); Spannable s = (Spannable) Html.fromHtml(parse, imageGetter, null); URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class); for (URLSpan span : spans) { int start = s.getSpanStart(span); int end = s.getSpanEnd(span); s.removeSpan(span); span = new URLSpanNoUnderline(span.getURL(), 0xff999999); s.setSpan(span, start, end, 0); } return s; }
public void run() { Spannable buf = mBuffer; if (buf != null) { int st = Selection.getSelectionStart(buf); int en = Selection.getSelectionEnd(buf); int start = buf.getSpanStart(TextKeyListener.ACTIVE); int end = buf.getSpanEnd(TextKeyListener.ACTIVE); if (st == start && en == end) { Selection.setSelection(buf, Selection.getSelectionEnd(buf)); } buf.removeSpan(Timeout.this); } }
public static CharSequence getHtmlText(String text) { // fixes an android bug (?): text layout fails on text with nested style tags text = removeNestedTags(text, new String[] {"i", "b", "strong"}); final Spanned htmlText = Html.fromHtml(text); if (htmlText.getSpans(0, htmlText.length(), URLSpan.class).length == 0) { return htmlText; } final Spannable newHtmlText = Spannable.Factory.getInstance().newSpannable(htmlText); for (URLSpan span : newHtmlText.getSpans(0, newHtmlText.length(), URLSpan.class)) { final int start = newHtmlText.getSpanStart(span); final int end = newHtmlText.getSpanEnd(span); final int flags = newHtmlText.getSpanFlags(span); final String url = NetworkLibrary.Instance().rewriteUrl(span.getURL(), true); newHtmlText.removeSpan(span); newHtmlText.setSpan(new URLSpan(url), start, end, flags); } return newHtmlText; }
/** 覆寫觸控事件,分辨出是否為連結的點擊。 */ @Override public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) { int action = event.getAction(); // 取得事件類型 if (action == MotionEvent.ACTION_UP || 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) { // 是連結點擊 if (widget instanceof LinkTextView) { // 如果實體是LinkTextView ((LinkTextView) widget).linkHit = true; } if (action == MotionEvent.ACTION_UP) { // 放開時 // link[0].onClick(widget); // 開啟連結 String url = ((URLSpan) link[0]).getURL(); Utils.clickUrl(widget, url); } else if (action == MotionEvent.ACTION_DOWN) { // 按下時 Selection.setSelection( buffer, buffer.getSpanStart(link[0]), buffer.getSpanEnd(link[0])); // 選擇連結 } return true; } else { // 不是連結點擊 if (widget instanceof LinkTextView) { // 如果實體是LinkTextView ((LinkTextView) widget).linkHit = false; } Selection.removeSelection(buffer); Touch.onTouchEvent(widget, buffer, event); return false; } } return Touch.onTouchEvent(widget, buffer, event); }
private static void fixLinks(Spannable spannable) { for (URLSpan span : spannable.getSpans(0, spannable.length(), URLSpan.class)) { final String url = span.getURL(); int start = spannable.getSpanStart(span); int end = spannable.getSpanEnd(span); int flags = spannable.getSpanFlags(span); URLSpan newSpan = new URLSpan(url) { @Override public void updateDrawState(TextPaint paramTextPaint) { super.updateDrawState(paramTextPaint); paramTextPaint.setUnderlineText(false); paramTextPaint.setColor(0xff006FC8); } }; spannable.removeSpan(span); spannable.setSpan(newSpan, start, end, flags); } }
@Override public boolean onTouchEvent(MotionEvent event) { TextView widget = (TextView) this; Object text = widget.getText(); if (text instanceof Spanned) { Spannable buffer = (Spannable) text; int action = event.getAction(); if (action == MotionEvent.ACTION_UP || 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) { if (action == MotionEvent.ACTION_UP) { link[0].onClick(widget); } else if (action == MotionEvent.ACTION_DOWN) { Selection.setSelection( buffer, buffer.getSpanStart(link[0]), buffer.getSpanEnd(link[0])); } return true; } } } return false; }
@Override public boolean onTouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); boolean result = false; int side = AndroidUtilities.dp(48); if (textLayout != null) { if (event.getAction() == MotionEvent.ACTION_DOWN || pressedLink != null && event.getAction() == MotionEvent.ACTION_UP) { if (event.getAction() == MotionEvent.ACTION_DOWN) { resetPressedLink(); try { int x2 = (int) (x - textX); int y2 = (int) (y - textY); final int line = textLayout.getLineForVertical(y2); final int off = textLayout.getOffsetForHorizontal(line, x2); final float left = textLayout.getLineLeft(line); if (left <= x2 && left + textLayout.getLineWidth(line) >= x2) { Spannable buffer = (Spannable) textLayout.getText(); ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class); if (link.length != 0) { resetPressedLink(); pressedLink = link[0]; result = true; try { int start = buffer.getSpanStart(pressedLink); urlPath.setCurrentLayout(textLayout, start); textLayout.getSelectionPath(start, buffer.getSpanEnd(pressedLink), urlPath); } catch (Exception e) { FileLog.e("tmessages", e); } } else { resetPressedLink(); } } else { resetPressedLink(); } } catch (Exception e) { resetPressedLink(); FileLog.e("tmessages", e); } } else if (pressedLink != null) { try { if (pressedLink instanceof URLSpanNoUnderline) { String url = ((URLSpanNoUnderline) pressedLink).getURL(); if (url.startsWith("@") || url.startsWith("#") || url.startsWith("/")) { if (delegate != null) { delegate.didPressUrl(url); } } } else { pressedLink.onClick(this); } } catch (Exception e) { FileLog.e("tmessages", e); } resetPressedLink(); result = true; } } else if (event.getAction() == MotionEvent.ACTION_CANCEL) { resetPressedLink(); } } return result || super.onTouchEvent(event); }
@Override public void onSuccess(Object result) { try { if (getActivity() != null) { if (result instanceof DescriptionResult) { resultData = (DescriptionResult) result; setUpVisibility(View.GONE, View.VISIBLE); btnBuy.setVisibility(View.VISIBLE); btnSell.setVisibility(View.VISIBLE); if (((DescriptionResult) result).getAssetClass() == null) { linearAssetName.setVisibility(View.GONE); viewAssetClass.setVisibility(View.GONE); } else { tvAssetClass.setText(((DescriptionResult) result).getAssetClass()); } if (((DescriptionResult) result).getDescription() == null) { linearDescription.setVisibility(View.GONE); viewDescription.setVisibility(View.GONE); } else { tvDescription.setText(((DescriptionResult) result).getDescription()); } if (((DescriptionResult) result).getIssuerName() == null) { linearIssuerName.setVisibility(View.GONE); viewIssuerName.setVisibility(View.GONE); } else { tvIssuerName.setText(((DescriptionResult) result).getIssuerName()); } if (((DescriptionResult) result).getNumberOfCoins() == null) { linearNumberOfCoins.setVisibility(View.GONE); viewNumberOfCoins.setVisibility(View.GONE); } else { tvNumberOfCoins.setText(((DescriptionResult) result).getNumberOfCoins()); } if (((DescriptionResult) result).getMarketCapitalization() == null) { linearMarketCapitalization.setVisibility(View.GONE); viewMarketCapitalization.setVisibility(View.GONE); } else { tvMarketCapitalization.setText(((DescriptionResult) result).getMarketCapitalization()); } if (((DescriptionResult) result).getAssetDescriptionUrl() == null) { linearDescriptionUrl.setVisibility(View.GONE); viewDescriptionUrl.setVisibility(View.GONE); } else { Spannable s = (Spannable) Html.fromHtml(((DescriptionResult) result).getAssetDescriptionUrl()); for (URLSpan u : s.getSpans(0, s.length(), URLSpan.class)) { s.setSpan( new UnderlineSpan() { public void updateDrawState(TextPaint tp) { tp.setUnderlineText(false); } }, s.getSpanStart(u), s.getSpanEnd(u), 0); } tvDescriptionUrl.setMovementMethod(LinkMovementMethod.getInstance()); tvDescriptionUrl.setLinksClickable(true); tvDescriptionUrl.setText(s); } Resources r = getResources(); float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, r.getDisplayMetrics()); float pxMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 3, r.getDisplayMetrics()); linearPop.removeAllViews(); for (int i = 0; i < Integer.parseInt(((DescriptionResult) result).getPopIndex()); i++) { ImageView imageView = new ImageView(getActivity()); imageView.setImageResource(R.drawable.star); LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(Math.round(px), Math.round(px)); lp.setMargins(Math.round(pxMargin), 0, Math.round(pxMargin), 0); imageView.setLayoutParams(lp); linearPop.addView(imageView); } if (Integer.parseInt(((DescriptionResult) result).getPopIndex()) == 0) { linearPopularity.setVisibility(View.GONE); } handler.post(run); } else if (result instanceof RateResult) { if (((RateResult) result).getRate() != null && ((RateResult) result).getRate().getAsk() != null && getActivity() != null) { price = BigDecimal.valueOf(((RateResult) result).getRate().getAsk()); if (assetPair.getInverted()) { price = BigDecimal.ONE.divide(price, accurancy, RoundingMode.HALF_EVEN); } btnBuy.setText( String.format(getString(R.string.buy_rate), mainName, subName) + " " + LykkeUtils.getStriped(accurancy, price)); } if (((RateResult) result).getRate() != null && ((RateResult) result).getRate().getBid() != null && getActivity() != null) { bid = BigDecimal.valueOf(((RateResult) result).getRate().getBid()); if (assetPair.getInverted()) { bid = BigDecimal.ONE.divide(bid, accurancy, RoundingMode.HALF_EVEN); } btnSell.setText( String.format(getString(R.string.sell_at_price), mainName, subName) + " " + LykkeUtils.getStriped(accurancy, bid)); } } } } catch (NullPointerException ex) { } }
@Override public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) { int action = event.getAction(); if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_CANCEL) { 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) { if (action == MotionEvent.ACTION_UP) { // 按下后松开,移除所有 BackgroundColorSpan。 BackgroundColorSpan[] backgroundColorSpans = buffer.getSpans(0, buffer.length(), BackgroundColorSpan.class); for (BackgroundColorSpan bkcolor : backgroundColorSpans) { buffer.removeSpan(bkcolor); } // Selection.removeSelection(buffer); link[0].onClick(widget); } else if (action == MotionEvent.ACTION_DOWN) { // 按下,给按下的 ClickableSpan 设置 BackgroundColorSpan。 /* Selection.setSelection(buffer, buffer.getSpanStart(link[0]), buffer.getSpanEnd(link[0])); */ BackgroundColorSpan bkcolor = new BackgroundColorSpan(0xff89660f); buffer.setSpan( bkcolor, buffer.getSpanStart(link[0]), buffer.getSpanEnd(link[0]), Spanned.SPAN_INCLUSIVE_INCLUSIVE); } else if (action == MotionEvent.ACTION_CANCEL) { // 按下不松开而是移动,则变成取消事件,移除所有 BackgroundColorSpan。 BackgroundColorSpan[] backgroundColorSpans = buffer.getSpans(0, buffer.length(), BackgroundColorSpan.class); for (BackgroundColorSpan bkcolor : backgroundColorSpans) { buffer.removeSpan(bkcolor); } } return true; } else { BackgroundColorSpan[] backgroundColorSpans = buffer.getSpans(0, buffer.length(), BackgroundColorSpan.class); for (BackgroundColorSpan bkcolor : backgroundColorSpans) { buffer.removeSpan(bkcolor); } // Selection.removeSelection(buffer); } } return super.onTouchEvent(widget, buffer, event); }
private int getStartIndex() { return mParent.getSpanStart(mSpan); }
/** * Applies formatting to selected text, or marks the entry for a new text style at the current * cursor position * * @param toggleButton button from formatting bar * @param tag HTML tag name for text style */ private void onFormatButtonClick(ToggleButton toggleButton, String tag) { Spannable s = mContentEditText.getText(); if (s == null) return; int selectionStart = mContentEditText.getSelectionStart(); mStyleStart = selectionStart; int selectionEnd = mContentEditText.getSelectionEnd(); if (selectionStart > selectionEnd) { int temp = selectionEnd; selectionEnd = selectionStart; selectionStart = temp; } Class styleClass = null; if (tag.equals(TAG_FORMAT_BAR_BUTTON_STRONG) || tag.equals(TAG_FORMAT_BAR_BUTTON_EM)) styleClass = StyleSpan.class; else if (tag.equals(TAG_FORMAT_BAR_BUTTON_UNDERLINE)) styleClass = WPUnderlineSpan.class; else if (tag.equals(TAG_FORMAT_BAR_BUTTON_STRIKE)) styleClass = StrikethroughSpan.class; else if (tag.equals(TAG_FORMAT_BAR_BUTTON_QUOTE)) styleClass = QuoteSpan.class; if (styleClass == null) return; Object[] allSpans = s.getSpans(selectionStart, selectionEnd, styleClass); boolean textIsSelected = selectionEnd > selectionStart; if (mIsLocalDraft) { // Local drafts can use the rich text editor. Yay! boolean shouldAddSpan = true; for (Object span : allSpans) { if (span instanceof StyleSpan) { StyleSpan styleSpan = (StyleSpan) span; if ((styleSpan.getStyle() == Typeface.BOLD && !tag.equals(TAG_FORMAT_BAR_BUTTON_STRONG)) || (styleSpan.getStyle() == Typeface.ITALIC && !tag.equals(TAG_FORMAT_BAR_BUTTON_EM))) { continue; } } if (!toggleButton.isChecked() && textIsSelected) { // If span exists and text is selected, remove the span s.removeSpan(span); shouldAddSpan = false; break; } else if (!toggleButton.isChecked()) { // Remove span at cursor point if button isn't checked Object[] spans = s.getSpans(mStyleStart - 1, mStyleStart, styleClass); for (Object removeSpan : spans) { selectionStart = s.getSpanStart(removeSpan); selectionEnd = s.getSpanEnd(removeSpan); s.removeSpan(removeSpan); } } } if (shouldAddSpan) { if (tag.equals(TAG_FORMAT_BAR_BUTTON_STRONG)) { s.setSpan( new StyleSpan(android.graphics.Typeface.BOLD), selectionStart, selectionEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } else if (tag.equals(TAG_FORMAT_BAR_BUTTON_EM)) { s.setSpan( new StyleSpan(android.graphics.Typeface.ITALIC), selectionStart, selectionEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } else { try { s.setSpan( styleClass.newInstance(), selectionStart, selectionEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } catch (java.lang.InstantiationException e) { AppLog.e(T.POSTS, e); } catch (IllegalAccessException e) { AppLog.e(T.POSTS, e); } } } } else { // Add HTML tags when editing an existing post String startTag = "<" + tag + ">"; String endTag = "</" + tag + ">"; Editable content = mContentEditText.getText(); if (textIsSelected) { content.insert(selectionStart, startTag); content.insert(selectionEnd + startTag.length(), endTag); toggleButton.setChecked(false); mContentEditText.setSelection(selectionEnd + startTag.length() + endTag.length()); } else if (toggleButton.isChecked()) { content.insert(selectionStart, startTag); mContentEditText.setSelection(selectionEnd + startTag.length()); } else if (!toggleButton.isChecked()) { content.insert(selectionEnd, endTag); mContentEditText.setSelection(selectionEnd + endTag.length()); } } }
@Override public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) { if (mGray == null) { mGray = new BackgroundColorSpan( widget.getContext().getResources().getColor(R.color.selector_gray)); } mIsLinkHit = false; int action = event.getAction(); if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_UP) { int x = (int) event.getX(); int y = (int) event.getY(); /*if (DEBUG) { Log.d(TAG, "x = " + x + " y = " + y); }*/ x -= widget.getTotalPaddingLeft(); y -= widget.getTotalPaddingTop(); /*if (DEBUG) { Log.d(TAG, "x = " + x + " y = " + y); }*/ x += widget.getScrollX(); y += widget.getScrollY(); int line = widget.getLayout().getLineForVertical(y); int offset = widget.getLayout().getOffsetForHorizontal(line, x); ClickableSpan[] spans = buffer.getSpans(offset, offset, ClickableSpan.class); /*if (DEBUG) { Log.d(TAG, "x = " + x + " y = " + y); Log.d(TAG, "line = " + line + " offset = " + offset); Log.d(TAG, "spans.lenth = " + spans.length); }*/ if (spans.length != 0) { int start = buffer.getSpanStart(spans[0]); int end = buffer.getSpanEnd(spans[0]); mIsLinkHit = true; if (action == MotionEvent.ACTION_DOWN) { /*if (DEBUG) { Log.d(TAG, "Down event detected"); }*/ buffer.setSpan(mGray, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } else if (action == MotionEvent.ACTION_UP) { /*if (DEBUG) { Log.d(TAG, "Up event detected"); }*/ spans[0].onClick(widget); buffer.removeSpan(mGray); } return true; } } else { buffer.removeSpan(mGray); } return Touch.onTouchEvent(widget, buffer, event); }