Java 类android.text.style.ClickableSpan 实例源码
项目:AdaptiveTableLayout
文件:CsvPickerFragment.java
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
SpannableString ss = new SpannableString(getString(R.string.pick_csv_or_demo_file));
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View textView) {
if (PermissionHelper.checkOrRequest(CsvPickerFragment.this, REQUEST_CODE_PERMISSION_READ_EXTERNAL_STORAGE_DEMO,
Manifest.permission.READ_EXTERNAL_STORAGE)) {
createDemoFile();
}
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
}
};
ss.setSpan(clickableSpan, 32, 36, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvPickFile.setText(ss);
tvPickFile.setMovementMethod(LinkMovementMethod.getInstance());
tvPickFile.setHighlightColor(Color.TRANSPARENT);
}
项目:TYT
文件:MessageCenterActivity.java
/**
* 解析URL和电话号码并高亮显示
*/
private SpannableString changeToLight(String str) {
SpannableString string = new SpannableString(str);
for (Pattern p : mPatterns) {
Matcher m = p.matcher(string);
while (m.find()) {
int start = m.start();
int end = m.end();
string.setSpan(new ClickableSpan() {
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setColor(getColors(R.color.color_theme));
}
@Override
public void onClick(View widget) {
}
}, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
return string;
}
项目:Phoenix-for-VK
文件:CommentsAdapter.java
private Spannable genTimeAndReplyText(final Comment comment) {
String time = AppTextUtils.getDateFromUnixTime(comment.getDate());
if (comment.getReplyToUser() == 0) {
return Spannable.Factory.getInstance().newSpannable(time);
}
String commentText = context.getString(R.string.comment).toLowerCase();
String target = context.getString(R.string.in_response_to, time, commentText);
int start = target.indexOf(commentText);
Spannable spannable = Spannable.Factory.getInstance().newSpannable(target);
ClickableSpan span = new ClickableSpan() {
@Override
public void onClick(View widget) {
onReplyClick(comment.getReplyToUser(), comment.getReplyToComment());
}
};
spannable.setSpan(span, start, target.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return spannable;
}
项目:Nird2
文件:UiUtils.java
public static void makeLinksClickable(TextView v) {
SpannableStringBuilder ssb = new SpannableStringBuilder(v.getText());
URLSpan[] spans = ssb.getSpans(0, ssb.length(), URLSpan.class);
for (URLSpan span : spans) {
int start = ssb.getSpanStart(span);
int end = ssb.getSpanEnd(span);
final String url = span.getURL();
ssb.removeSpan(span);
ClickableSpan cSpan = new ClickableSpan() {
@Override
public void onClick(View v2) {
LinkDialogFragment f = LinkDialogFragment.newInstance(url);
FragmentManager fm = ((AppCompatActivity) v2.getContext())
.getSupportFragmentManager();
f.show(fm, f.getUniqueTag());
}
};
ssb.setSpan(cSpan, start, end, 0);
}
v.setText(ssb);
v.setMovementMethod(ArticleMovementMethod.getInstance());
}
项目:Nird2
文件:UiUtils.java
public static void makeLinksClickable(TextView v) {
SpannableStringBuilder ssb = new SpannableStringBuilder(v.getText());
URLSpan[] spans = ssb.getSpans(0, ssb.length(), URLSpan.class);
for (URLSpan span : spans) {
int start = ssb.getSpanStart(span);
int end = ssb.getSpanEnd(span);
final String url = span.getURL();
ssb.removeSpan(span);
ClickableSpan cSpan = new ClickableSpan() {
@Override
public void onClick(View v2) {
LinkDialogFragment f = LinkDialogFragment.newInstance(url);
FragmentManager fm = ((AppCompatActivity) v2.getContext())
.getSupportFragmentManager();
f.show(fm, f.getUniqueTag());
}
};
ssb.setSpan(cSpan, start, end, 0);
}
v.setText(ssb);
v.setMovementMethod(ArticleMovementMethod.getInstance());
}
项目:MainCalendar
文件:AboutActivity.java
/**
* 获取超链接字段
* @return 超链接字符串
*/
private SpannableString getClickableSpan(String aStr) {
int startIndex = aStr.indexOf(mAuthorName);
int endIndex = startIndex + mAuthorName.length();
SpannableString spannableString = new SpannableString(aStr);
//设置下划线文字
// spannableString.setSpan(new UnderlineSpan(), startIndex, endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置文字的单击事件
spannableString.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
Uri uri = Uri.parse(mExtLink);
Context context = widget.getContext();
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName());
context.startActivity(intent);
}
}, startIndex, endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置文字的前景色
spannableString.setSpan(new ForegroundColorSpan(ThemeStyle.Accent), startIndex, endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return spannableString;
}
项目:chromium-for-android-56-debug-video
文件:PermissionDialogController.java
private CharSequence prepareMainMessageString(final PermissionDialogDelegate delegate) {
SpannableStringBuilder fullString = new SpannableStringBuilder();
String messageText = delegate.getMessageText();
String linkText = delegate.getLinkText();
if (!TextUtils.isEmpty(messageText)) fullString.append(messageText);
// If the linkText exists, then wrap it in a clickable span and concatenate it with the main
// dialog message.
if (!TextUtils.isEmpty(linkText)) {
if (fullString.length() > 0) fullString.append(" ");
int spanStart = fullString.length();
fullString.append(linkText);
fullString.setSpan(new ClickableSpan() {
@Override
public void onClick(View view) {
mDecision = NOT_DECIDED;
delegate.onLinkClicked();
if (mDialog != null) mDialog.dismiss();
}
}, spanStart, fullString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return fullString;
}
项目:chromium-for-android-56-debug-video
文件:PhysicalWebOptInActivity.java
private SpannableString getDescriptionText() {
return SpanApplier.applySpans(
getString(R.string.physical_web_optin_description),
new SpanInfo("<learnmore>", "</learnmore>", new ClickableSpan() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW,
Uri.parse(PHYSICAL_WEB_LEARN_MORE_URL));
// Add the SESSION extra to indicate we want a Chrome custom tab. This
// allows the help page to open in the same task as the opt-in activity so
// they can share a back stack.
String session = null;
intent.putExtra(EXTRA_CUSTOM_TABS_SESSION, session);
PhysicalWebOptInActivity.this.startActivity(intent);
}
@Override
public void updateDrawState(TextPaint ds) {
// Color links but do not underline them.
ds.setColor(ds.linkColor);
}
}));
}
项目:chromium-for-android-56-debug-video
文件:PassphraseTypeDialogFragment.java
private SpannableString getResetText() {
final Context context = getActivity();
return SpanApplier.applySpans(
context.getString(R.string.sync_passphrase_encryption_reset_instructions),
new SpanInfo("<resetlink>", "</resetlink>", new ClickableSpan() {
@Override
public void onClick(View view) {
Uri syncDashboardUrl = Uri.parse(
context.getText(R.string.sync_dashboard_url).toString());
Intent intent = new Intent(Intent.ACTION_VIEW, syncDashboardUrl);
intent.setPackage(BuildInfo.getPackageName(context));
IntentUtils.safePutBinderExtra(
intent, CustomTabsIntent.EXTRA_SESSION, null);
context.startActivity(intent);
}
}));
}
项目:chromium-for-android-56-debug-video
文件:PassphraseDialogFragment.java
private SpannableString getResetText() {
final Context context = getActivity();
return SpanApplier.applySpans(
context.getString(R.string.sync_passphrase_reset_instructions),
new SpanInfo("<resetlink>", "</resetlink>", new ClickableSpan() {
@Override
public void onClick(View view) {
recordPassphraseDialogDismissal(PASSPHRASE_DIALOG_RESET_LINK);
Uri syncDashboardUrl = Uri.parse(
context.getText(R.string.sync_dashboard_url).toString());
Intent intent = new Intent(Intent.ACTION_VIEW, syncDashboardUrl);
intent.setPackage(BuildInfo.getPackageName(context));
IntentUtils.safePutBinderExtra(
intent, CustomTabsIntent.EXTRA_SESSION, null);
context.startActivity(intent);
}
}));
}
项目:chromium-for-android-56-debug-video
文件:UpdatePasswordInfoBar.java
@Override
public void createContent(InfoBarLayout layout) {
super.createContent(layout);
if (mTitleLinkRangeStart != 0 && mTitleLinkRangeEnd != 0) {
SpannableString title = new SpannableString(mTitle);
title.setSpan(new ClickableSpan() {
@Override
public void onClick(View view) {
onLinkClicked();
}
}, mTitleLinkRangeStart, mTitleLinkRangeEnd, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
layout.setMessage(title);
}
InfoBarControlLayout controlLayout = layout.addControlLayout();
if (mUsernames.length > 1) {
InfoBarArrayAdapter<String> usernamesAdapter =
new InfoBarArrayAdapter<String>(getContext(), mUsernames);
mUsernamesSpinner = controlLayout.addSpinner(
R.id.password_infobar_accounts_spinner, usernamesAdapter);
} else {
controlLayout.addDescription(mUsernames[0]);
}
}
项目:chromium-for-android-56-debug-video
文件:DuplicateDownloadInfoBar.java
/**
* Gets the infobar text for offline page downloads.
* @param context Context to be used.
* @param template Template of the text to be displayed.
*/
private CharSequence getOfflinePageMessageText(final Context context, final String template) {
return getMessageText(template, mFilePath, new ClickableSpan() {
@Override
public void onClick(View view) {
// TODO(qinmin): open the offline page on local storage instead of opening the url.
// However, there could be multiple stored offline pages for the same url, need to
// figure out which one to use.
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(mPageUrl));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setPackage(context.getPackageName());
context.startActivity(intent);
}
});
}
项目:chromium-for-android-56-debug-video
文件:InfoBarLayout.java
/**
* Prepares text to be displayed as the infobar's main message, including setting up a
* clickable link if the infobar requires it.
*/
private CharSequence prepareMainMessageString() {
SpannableStringBuilder fullString = new SpannableStringBuilder();
if (mMessageMainText != null) fullString.append(mMessageMainText);
// Concatenate the text to display for the link and make it clickable.
if (!TextUtils.isEmpty(mMessageLinkText)) {
if (fullString.length() > 0) fullString.append(" ");
int spanStart = fullString.length();
fullString.append(mMessageLinkText);
fullString.setSpan(new ClickableSpan() {
@Override
public void onClick(View view) {
mInfoBarView.onLinkClicked();
}
}, spanStart, fullString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return fullString;
}
项目:chromium-for-android-56-debug-video
文件:AutofillSaveCardInfoBar.java
@Override
public void createContent(InfoBarLayout layout) {
super.createContent(layout);
InfoBarControlLayout control = layout.addControlLayout();
for (int i = 0; i < mCardDetails.size(); i++) {
CardDetail detail = mCardDetails.get(i);
control.addIcon(detail.issuerIconDrawableId, 0, detail.label, detail.subLabel);
}
for (LegalMessageLine line : mLegalMessageLines) {
SpannableString text = new SpannableString(line.text);
for (final LegalMessageLine.Link link : line.links) {
text.setSpan(new ClickableSpan() {
@Override
public void onClick(View view) {
nativeOnLegalMessageLinkClicked(mNativeAutofillSaveCardInfoBar, link.url);
}
}, link.start, link.end, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
}
control.addDescription(text);
}
}
项目:chromium-for-android-56-debug-video
文件:SearchGeolocationDisclosureInfoBar.java
@Override
public void createContent(InfoBarLayout layout) {
super.createContent(layout);
SpannableString message = new SpannableString(mMessageText);
message.setSpan(
new ClickableSpan() {
@Override
public void onClick(View view) {
onLinkClicked();
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
}
}, mInlineLinkRangeStart, mInlineLinkRangeEnd, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
layout.setMessage(message);
}
项目:TagEditText
文件:TagEditText.java
private void setSpans(final Tag tag) {
final TagSpan tagSpan = recycleTag(tag);
final ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(final View widget) {
removeSpan(tag);
}
};
getText().setSpan(
tagSpan,
tag.getStartIndex(),
tag.getEndIndex(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
getText().setSpan(
clickableSpan,
tag.getStartIndex(),
tag.getEndIndex(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
项目:mvvm-template
文件:BetterLinkMovementExtended.java
private BetterLinkMovementExtended.ClickableSpanWithText findClickableSpanUnderTouch(TextView textView, Spannable text, MotionEvent event) {
int touchX = (int) event.getX();
int touchY = (int) event.getY();
touchX -= textView.getTotalPaddingLeft();
touchY -= textView.getTotalPaddingTop();
touchX += textView.getScrollX();
touchY += textView.getScrollY();
Layout layout = textView.getLayout();
int touchedLine = layout.getLineForVertical(touchY);
int touchOffset = layout.getOffsetForHorizontal(touchedLine, (float) touchX);
this.touchedLineBounds.left = layout.getLineLeft(touchedLine);
this.touchedLineBounds.top = (float) layout.getLineTop(touchedLine);
this.touchedLineBounds.right = layout.getLineWidth(touchedLine) + this.touchedLineBounds.left;
this.touchedLineBounds.bottom = (float) layout.getLineBottom(touchedLine);
if (this.touchedLineBounds.contains((float) touchX, (float) touchY)) {
Object[] spans = text.getSpans(touchOffset, touchOffset, SPAN_CLASS);
for (Object span : spans) {
if (span instanceof ClickableSpan) {
return ClickableSpanWithText.ofSpan(textView, (ClickableSpan) span);
}
}
return null;
} else {
return null;
}
}
项目:FastTextView
文件:ClickableSpanUtil.java
public static boolean handleClickableSpan(View view, Layout layout, 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 -= view.getPaddingLeft();
y -= view.getPaddingTop();
x += view.getScrollX();
y += view.getScrollY();
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(view);
} else {
Selection.setSelection(buffer,
buffer.getSpanStart(link[0]),
buffer.getSpanEnd(link[0]));
}
return true;
} else {
Selection.removeSelection(buffer);
}
}
return false;
}
项目:OSchina_resources_android
文件:RichTextParser.java
/**
* 格式化git项目标签
*/
static Spannable parseOnlyGit(final Context context, CharSequence content) {
SpannableStringBuilder builder = new SpannableStringBuilder(content);
Matcher matcher;
while (true) {
matcher = PatternGit.matcher(builder.toString());
if (matcher.find()) {
final String group0 = matcher.group(2);
final String group1 = matcher.group(3);
builder.replace(matcher.start(), matcher.end(), group1);
ClickableSpan span = new ClickableSpan() {
@Override
public void onClick(View widget) {
Project project = new Project();
project.setId(Integer.parseInt(group0));
ProjectDetailActivity.show(context, project);
}
};
builder.setSpan(span, matcher.start(), matcher.start() + group1.length(),
Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
continue;
}
break;
}
return builder;
}
项目:getword
文件:GetWordTextView.java
/**
* 重写点击事件
* @return
*/
private ClickableSpan getClickableSpan() {
return new ClickableSpan() {
@Override
public void onClick(View widget) {
TextView tv = (TextView) widget;
String word = tv.getText().toString().trim().subSequence(tv.getSelectionStart(), tv.getSelectionEnd()).toString();
setSelectedSpan(tv);
if (mOnWordClickListener != null) {
mOnWordClickListener.onClick(word);
}
}
@Override
public void updateDrawState(TextPaint ds) {
}
};
}
项目:Ghost-Android
文件: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());
}
项目:Pocket-Plays-for-Twitch
文件:ChatAdapter.java
private void checkForLink(String message, SpannableStringBuilder spanbuilder) {
linkMatcher = linkPattern.matcher(message);
while(linkMatcher.find()) {
final String url = linkMatcher.group(1);
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View view) {
CustomTabsIntent.Builder mTabs = new CustomTabsIntent.Builder();
mTabs.setStartAnimations(context, R.anim.slide_in_bottom_anim, R.anim.fade_out_semi_anim);
mTabs.setExitAnimations(context, R.anim.fade_in_semi_anim, R.anim.slide_out_bottom_anim);
mTabs.build().launchUrl(context, Uri.parse(url));
Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(25);
}
};
int start = message.indexOf(url);
spanbuilder.setSpan(clickableSpan, start, start + url.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
项目:Simpler
文件:StatusDataSetter.java
/**
* 微博文本触摸监听处理
*
* @param textView 点击的TextView
* @param event
* @return true:点击事件被处理;false:点击事件未被处理,向上冒泡
*/
private boolean textTouchEvent(TextView textView, MotionEvent event) {
boolean ret = false;
CharSequence text = textView.getText();
Spannable sText = Spannable.Factory.getInstance().newSpannable(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 -= textView.getTotalPaddingLeft();
y -= textView.getTotalPaddingTop();
x += textView.getScrollX();
y += textView.getScrollY();
Layout layout = textView.getLayout();
int line = layout.getLineForVertical(y);
int offset = layout.getOffsetForHorizontal(line, x);
ClickableSpan[] links = sText.getSpans(offset, offset, ClickableSpan.class);
if (links.length != 0) {
if (action == MotionEvent.ACTION_UP) {
links[0].onClick(textView);
}
ret = true;
}
}
return ret;
}
项目:ShangHanLun
文件:LittleTableViewWindow.java
public boolean isInFangContext() {
SpannableStringBuilder builder = attributedString;
ClickableSpan[] spans = builder.getSpans(0,
builder.length(), ClickableSpan.class);
Map<String, String> dict = SingletonData.getInstance().getFangAliasDict();
if (spans.length > 0) {
ClickableSpan span = spans[0];
int start = builder.getSpanStart(span);
int end = builder.getSpanEnd(span);
String unit = builder.subSequence(start, end)
.toString();
String left = dict.get(unit);
if (left == null) {
left = unit;
}
if (SingletonData.getInstance().getAllFang().contains(left)
&& start > 0
&& builder.toString().substring(start - 1, start).equals("、")
&& builder.charAt(0) != '*') {
return true;
}
}
return false;
}
项目:ShangHanLun
文件:LittleTextViewWindow.java
public boolean isInYaoContext() {
SpannableStringBuilder builder = attributedString;
ClickableSpan[] spans = builder.getSpans(0,
builder.length(), ClickableSpan.class);
Map<String, String> dict = SingletonData.getInstance().getYaoAliasDict();
if (spans.length > 0) {
ClickableSpan span = spans[0];
int start = builder.getSpanStart(span);
int end = builder.getSpanEnd(span);
String unit = builder.subSequence(start, end)
.toString();
String left = dict.get(unit);
if (left == null) {
left = unit;
}
if (SingletonData.getInstance().getAllYao().contains(left)
&& start > 0
&& builder.toString().substring(start - 1, start).equals("、")) {
return true;
}
}
return false;
}
项目:boohee_v5.6
文件:LinkUtils.java
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;
}
项目:Cable-Android
文件:RegistrationProgressActivity.java
private void initializeLinks() {
TextView failureText = (TextView) findViewById(R.id.sms_failed_text);
String pretext = getString(R.string.registration_progress_activity__signal_timed_out_while_waiting_for_a_verification_sms_message);
String link = getString(R.string.RegistrationProblemsActivity_possible_problems);
SpannableString spannableString = new SpannableString(pretext + " " + link);
spannableString.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
new AlertDialog.Builder(RegistrationProgressActivity.this)
.setTitle(R.string.RegistrationProblemsActivity_possible_problems)
.setView(R.layout.registration_problems)
.setNeutralButton(android.R.string.ok, null)
.show();
}
}, pretext.length() + 1, spannableString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
failureText.setText(spannableString);
failureText.setMovementMethod(LinkMovementMethod.getInstance());
}
项目:Demos
文件:TouchLinkMovementMethod.java
@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);
}
项目:GitHub
文件:ClickableMovementMethod.java
@Override
public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
int action = event.getActionMasked();
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 {
Selection.setSelection(buffer, buffer.getSpanStart(link[0]),
buffer.getSpanEnd(link[0]));
}
return true;
} else {
Selection.removeSelection(buffer);
}
}
return false;
}
项目:ExtraMapUtils
文件:AppUtils.java
public static void setTextWithLinks(TextView textView, CharSequence html) {
textView.setText(html);
textView.setOnTouchListener(new View.OnTouchListener() {
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View v, 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();
TextView widget = (TextView) v;
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 = Spannable.Factory.getInstance()
.newSpannable(widget.getText())
.getSpans(off, off, ClickableSpan.class);
if (link.length != 0) {
if (action == MotionEvent.ACTION_UP) {
link[0].onClick(widget);
}
return true;
}
}
return false;
}
});
}
项目:ceji_android
文件:ScrollingStrategy.java
private Spannable addEndTag(SpannableStringBuilder builder) {
//Don't add the tag to the last section.
Spine spine = bookView.getSpine();
if (spine == null || spine.getPosition() >= spine.size() -1 ) {
return builder;
}
int length = builder.length();
builder.append("\uFFFC");
builder.append("\n");
builder.append( context.getString(R.string.end_of_section));
//If not, consider it an internal nav link.
ClickableSpan span = new ClickableSpan() {
@Override
public void onClick(View widget) {
pageDown();
}
};
Drawable img = context.getResources().getDrawable(R.drawable.gateway);
img.setBounds(0, 0, img.getIntrinsicWidth(), img.getIntrinsicHeight() );
builder.setSpan(new ImageSpan(img), length, length+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
builder.setSpan(span, length, builder.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
builder.setSpan( (AlignmentSpan) () -> Alignment.ALIGN_CENTER
, length, builder.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return builder;
}
项目:CodeWatch
文件:AboutActivity.java
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_about);
ButterKnife.bind(this);
poweredBy.setMovementMethod(LinkMovementMethod.getInstance());
String developedByText = getString(R.string.developed_by);
SpannableString spannableString = new SpannableString(developedByText);
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View widget) {
openMyProfile();
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
}
};
spannableString.setSpan(
clickableSpan,
developedByText.indexOf('G'), developedByText.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
developedBy.setText(spannableString);
developedBy.setMovementMethod(LinkMovementMethod.getInstance());
developedBy.setHighlightColor(getResources().getColor(R.color.colorAccent));
}
项目:Phoenix-for-VK
文件:PrivacyAdapter.java
private void bindTitle(TitleViewHolder holder) {
if (mLayoutManager instanceof StaggeredGridLayoutManager) {
StaggeredGridLayoutManager.LayoutParams layoutParams = new StaggeredGridLayoutManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.setFullSpan(true);
holder.itemView.setLayoutParams(layoutParams);
}
final int position = holder.getAdapterPosition();
if (position == 0) {
String title = mContext.getString(getTypeTitle());
String fullText = mContext.getString(R.string.who_can_have_access) + " " + title;
Spannable spannable = SpannableStringBuilder.valueOf(fullText);
ClickableSpan span = new ClickableSpan() {
@Override
public void onClick(View widget) {
if(mActionListener != null){
mActionListener.onTypeClick();
}
}
};
spannable.setSpan(span, fullText.length() - title.length(), fullText.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
holder.title.setText(spannable, TextView.BufferType.SPANNABLE);
} else {
holder.title.setText(R.string.who_cannot_have_access);
}
holder.buttonAdd.setOnClickListener(v -> {
if(mActionListener != null){
if(position == 0){
mActionListener.onAddToAllowedClick();
} else {
mActionListener.onAddToDisallowedClick();
}
}
});
}
项目:TurboChat
文件:EspressoTestUtils.java
public static ViewAction clickClickableSpan(final CharSequence textToClick) {
return new ViewAction() {
@Override
public Matcher<View> getConstraints() {
return instanceOf(TextView.class);
}
@Override
public String getDescription() {
return "clicking on a ClickableSpan";
}
@Override
public void perform(UiController uiController, View view) {
TextView textView = (TextView) view;
SpannableString spannableString = (SpannableString) textView.getText();
if (spannableString.length() == 0) {
// TextView is empty, nothing to do
throw new NoMatchingViewException.Builder()
.includeViewHierarchy(true)
.withRootView(textView)
.build();
}
// Get the links inside the TextView and check if we find textToClick
ClickableSpan[] spans = spannableString.getSpans(0, spannableString.length(), ClickableSpan.class);
if (spans.length > 0) {
ClickableSpan spanCandidate;
for (ClickableSpan span : spans) {
spanCandidate = span;
int start = spannableString.getSpanStart(spanCandidate);
int end = spannableString.getSpanEnd(spanCandidate);
CharSequence sequence = spannableString.subSequence(start, end);
if (textToClick.toString().equals(sequence.toString())) {
span.onClick(textView);
return;
}
}
}
// textToClick not found in TextView
throw new NoMatchingViewException.Builder()
.includeViewHierarchy(true)
.withRootView(textView)
.build();
}
};
}
项目:godlibrary
文件:SpannableUtils.java
public static SpannableString setTextSpannable(TextView textView, String[] strings, int[] color, final OnItemViewListener listener) {
int start = 0;
int end = 0;
StringBuilder sb = new StringBuilder();
for (String str : strings) {
if (str != null) {
sb.append(str);
}
}
SpannableString spannableString = new SpannableString(sb.toString());
for (int i = 0; i < strings.length; ++i) {
if (strings[i] != null) {
end += strings[i].length();
if (color.length == 1) {
spannableString.setSpan(new ForegroundColorSpan(textView.getResources().getColor(color[0])), start, end, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
} else if (color[i] > 0) {
spannableString.setSpan(new ForegroundColorSpan(textView.getResources().getColor(color[i])), start, end, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
}
if (listener != null) {
final int finalI = i;
ClickableSpan cbs = new ClickableSpan() {
@Override
public void onClick(View view) {
listener.onItemViewClick(null, view, finalI);
}
@Override
public void updateDrawState(TextPaint textPaint) {
textPaint.setUnderlineText(false);
}
};
spannableString.setSpan(cbs, start, end, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
}
start += strings[i].length();
}
}
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(spannableString);
return spannableString;
}
项目:mongol-library
文件:MongolTextView.java
@Override
public boolean onTouchEvent(MotionEvent event) {
// this method is currently only for detecting a ClickableSpan
if (mMovementMethod != null && event.getAction() == MotionEvent.ACTION_UP) {
int x = (int) event.getX();
int y = (int) event.getY();
int offset = getOffsetForPosition(x, y);
final ClickableSpan[] links = mTextStorage.getSpans(offset, offset, ClickableSpan.class);
if (links.length > 0) {
links[0].onClick(this);
return true;
}
}
return super.onTouchEvent(event);
// switch (event.getAction()) {
// case MotionEvent.ACTION_UP:
//
// int x = (int) event.getX();
// int y = (int) event.getY();
// int offset = getOffsetForPosition(x, y);
//
// final ClickableSpan[] links = mTextStorage.getSpans(offset, offset, ClickableSpan.class);
//
// if (links.length > 0) {
// links[0].onClick(this);
// return true;
// }
// break;
// }
//
// return true;
}
项目:TestChat
文件:CommentListView.java
private SpannableString getClickableSpan(final String name, final String uid) {
SpannableString spannableString = new SpannableString(name);
spannableString.setSpan(new ForegroundColorSpan(Color.parseColor("#232121")), 0, name.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
if (mCommentItemClickListener != null) {
LogUtil.e("点击了评论的belong用户");
mCommentItemClickListener.onCommentItemNameClick(uid);
}
}
}, 0, name.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return spannableString;
}
项目:TestChat
文件:LikerTextView.java
private SpannableString getClickableSpan(final String uid) {
User user;
if (uid.equals(UserManager.getInstance().getCurrentUserObjectId())) {
user = UserManager.getInstance().getCurrentUser();
} else {
user = UserCacheManager.getInstance().getUser(uid);
}
SpannableString spannableString = new SpannableString(user.getUsername());
spannableString.setSpan(new ClickableSpan() {
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setColor(defaultBgColor);
ds.setUnderlineText(false);
ds.clearShadowLayer();
}
@Override
public void onClick(View widget) {
if (listener != null) {
listener.onItemTextClick(uid);
}
}
}
, 0, user.getUsername().length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return spannableString;
}
项目:Nird2
文件:ArticleMovementMethod.java
@Override
public boolean onTouchEvent(TextView widget, Spannable buffer,
MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_UP) {
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 super.onTouchEvent(widget, buffer, event);
}
项目:Nird2
文件:ArticleMovementMethod.java
@Override
public boolean onTouchEvent(TextView widget, Spannable buffer,
MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_UP) {
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 super.onTouchEvent(widget, buffer, event);
}