Android 如何为单个文本视图设置多个单击事件?
我有一个文本视图,如下所示:Android 如何为单个文本视图设置多个单击事件?,android,string,dynamic,textview,clickablespan,Android,String,Dynamic,Textview,Clickablespan,我有一个文本视图,如下所示: txtByRegistering.setText("By Registering you agree to terms and condition and privacy policy"); 这只是一篇大文章。所以,我用选框来水平滚动文本。那很好。我的问题是,如何在单击所选滚动文本时调用click事件 例如: 当用户在上面的文本视图中单击单词“注册”时,我必须调用新的意图 当用户点击“术语”一词时,我必须 调用另一个新的意图(术语为webview的活动具有URL链
txtByRegistering.setText("By Registering you agree to terms and condition and privacy policy");
这只是一篇大文章。所以,我用选框来水平滚动文本。那很好。我的问题是,如何在单击所选滚动文本时调用click事件
例如:
URL链接
) String mRegDesc = "By registering you agree to the " + "<a href=\""
+ Constant.URL + "/terms_and_conditions"
+ "\">Terms of Use</a> " + "and " + "<a href=\"" + Constant.URL
+ "/privacy" + "\">Privacy Policy</a> ";
txtByRegistering.setText(Html.fromHtml(mRegDesc));
txtByRegistering.setMovementMethod(LinkMovementMethod.getInstance());
txtByRegistering.setSelected(true);
txtByRegistering.setTypeface(mTyFaceOverLockReg, Typeface.BOLD);
String mRegDesc=“通过注册您同意“+”+”和“+”;
txtByRegistering.setText(Html.fromHtml(mRegDesc));
setMovementMethod(LinkMovementMethod.getInstance());
txtByRegistering.setSelected(true);
setTypeface(mTyFaceOverLockReg,Typeface.BOLD);
上面的代码工作正常,当我单击“术语”一词时,它会将我带到浏览器,但我希望转到新活动。最后
我找到了解决办法
以下是解决方案:
SpannableString SpanString = new SpannableString(
"By Registering you agree to the Terms of Use and Privacy Policy");
ClickableSpan teremsAndCondition = new ClickableSpan() {
@Override
public void onClick(View textView) {
Intent mIntent = new Intent(SignUp.this, CommonWebView.class);
mIntent.putExtra("isTermsAndCondition", true);
startActivity(mIntent);
}
};
// Character starting from 32 - 45 is Terms and condition.
// Character starting from 49 - 63 is privacy policy.
ClickableSpan privacy = new ClickableSpan() {
@Override
public void onClick(View textView) {
Intent mIntent = new Intent(SignUp.this, CommonWebView.class);
mIntent.putExtra("isPrivacyPolicy", true);
startActivity(mIntent);
}
};
SpanString.setSpan(teremsAndCondition, 32, 45, 0);
SpanString.setSpan(privacy, 49, 63, 0);
SpanString.setSpan(new ForegroundColorSpan(Color.BLUE), 32, 45, 0);
SpanString.setSpan(new ForegroundColorSpan(Color.BLUE), 49, 63, 0);
SpanString.setSpan(new UnderlineSpan(), 32, 45, 0);
SpanString.setSpan(new UnderlineSpan(), 49, 63, 0);
txtByRegistering.setMovementMethod(LinkMovementMethod.getInstance());
txtByRegistering.setText(SpanString, BufferType.SPANNABLE);
txtByRegistering.setSelected(true);
感谢Shayan pourvatan。假设这是您的完整字符串 通过注册,我同意条款和隐私政策 您要使其可单击的字符串是 条款和隐私政策 所以,这是我的诀窍
ClickableSpan terms = new ClickableSpan() {
@Override
public void onClick(View widget) {
new Utils(getActivity()).shortToast("Terms");
}
};
ClickableSpan privacy = new ClickableSpan() {
@Override
public void onClick(View widget) {
new Utils(getActivity()).shortToast("Privacy");
}
};
此功能的主要功能
public void setClickableString(String wholeValue, TextView textView, final String[] clickableValue, ClickableSpan[] clickableSpans) {
SpannableString spannableString = new SpannableString(wholeValue);
for (int i = 0; i < clickableValue.length; i++) {
ClickableSpan clickableSpan = clickableSpans[i];
String link = clickableValue[i];
int startIndexOfLink = wholeValue.indexOf(link);
spannableString.setSpan(clickableSpan, startIndexOfLink, startIndexOfLink + link.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
textView.setHighlightColor(
Color.TRANSPARENT); // prevent TextView change background when highlight
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(spannableString, TextView.BufferType.SPANNABLE);
}
使用这一个它对我有效在单一文本视图中单击两次 步骤1-:您的文本将显示在SpannableString中 第2步:-像这样添加点击可点击范围 最后一步添加您的点击SpannableString和字符开始和结束索引,如注册单词在第3位开始,在11位结束,所以添加点击注册单词 在文本视图中添加您的SpannableString后的术语相同
我建议在下面的代码中使用
TextView
中的可点击字符串,它是动态的。
此代码的优点是,如果您多次使用相同的字符串
,则可以同时单击两个字符串
。例如,如果您想设置单击,字符串是男孩正在打板球<代码>男孩正在踢足球
男孩
是两个单词的两倍,两个单词都可以点击
public void setClicksOnString(String completeString, List<String> stringsToClick, TextView textView) {
SpannableString spannableString = new SpannableString(completeString);
for (int m = 0; m < stringsToClick.size(); m++) {
Matcher matcher = Pattern.compile(stringsToClick.get(m)).matcher(spannableString);
while (matcher.find()) {
ClickableSpan stringClick = new ClickableSpan() {
@Override
public void onClick(View widget) {
//you compare the string and your click logics
}
};
spannableString.setSpan(stringClick, matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
textView.setHighlightColor(
Color.TRANSPARENT); // prevent TextView change background when highlight
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(spannableString, TextView.BufferType.SPANNABLE);
}
public void setClicksOnString(字符串完成字符串、列表字符串单击、文本视图文本视图){
SpannableString SpannableString=新的SpannableString(completeString);
对于(int m=0;m
此外,如果您想知道用户在哪个文本中动态单击,请使用下面的
ClickableSpan listener = new ClickableSpan() {
@Override
public void onClick(View textView) {
TextView tv = (TextView) textView;
Spanned s = (Spanned) tv.getText();
int start = s.getSpanStart(this);
int end = s.getSpanEnd(this);
String clickedText = s.toString().substring(start,end);
}
};
我想您需要
ClickableSpan
,请参见@Shayanpourvatan上的我的答案我可以为单个spannablesting设置多个ClickableSpan
?请你再详细一点好吗?SpannableString支持API级别8?是的,您可以在一个字符串上设置多个ClickAbable,并且此方法添加到API级别1上。有关更多信息,请参阅以及如何更改下划线颜色的任何想法,请与我联系!向你致意
ClickableSpan Registering = new ClickableSpan() {
@Override
public void onClick(View textView) {
Intent intent=new Intent(this,WebView_Activity.class);
startActivity(intent);
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(true);
}
};
ClickableSpan terms = new ClickableSpan() {
@Override
public void onClick(View textView) {
Intent intent=new Intent(this,WebView_Activity.class);
startActivity(intent);
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(true);
}
};
ss.setSpan(Registering , 3, 11, 0);
textview.setMovementMethod(LinkMovementMethod.getInstance());
textview.setText(ss, TextView.BufferType.SPANNABLE);
textview.setSelected(true);
public void setClicksOnString(String completeString, List<String> stringsToClick, TextView textView) {
SpannableString spannableString = new SpannableString(completeString);
for (int m = 0; m < stringsToClick.size(); m++) {
Matcher matcher = Pattern.compile(stringsToClick.get(m)).matcher(spannableString);
while (matcher.find()) {
ClickableSpan stringClick = new ClickableSpan() {
@Override
public void onClick(View widget) {
//you compare the string and your click logics
}
};
spannableString.setSpan(stringClick, matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
textView.setHighlightColor(
Color.TRANSPARENT); // prevent TextView change background when highlight
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(spannableString, TextView.BufferType.SPANNABLE);
}
ClickableSpan listener = new ClickableSpan() {
@Override
public void onClick(View textView) {
TextView tv = (TextView) textView;
Spanned s = (Spanned) tv.getText();
int start = s.getSpanStart(this);
int end = s.getSpanEnd(this);
String clickedText = s.toString().substring(start,end);
}
};