将 OnTouch 和 OnClickListener 添加到 TextView 中的 link 并更改 link 的背景颜色
Adding OnTouch and OnClickListener to the links in a TextView and changing background color of the link
我有一个文本视图和 links。我希望 links 在我触摸它们时突出显示,并且我还想在我长按它们时打开一个警报对话框。我试图通过自定义 URLSpan 来解决这个问题,但是,由于在调用 OnClick 之前我无法访问 mView,所以我无法设置监听器:
class ConfirmSpan extends URLSpan{
View mView;
URLSpan span;
public ConfirmSpan(URLSpan span) {
super(span.getURL());
this.span = span;
//there is a nullpointerexception here since mView is null now.
mView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
((TextView)v).setBackgroundColor(0xcccccccc);
return false;
}
});
//this is also an exception
mView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
Log.d("INFO","long click yay!");
return false;
}
});
}
//this should be called to reach the view. But then I can't handle touch state.
@Override
public void onClick(View widget) {
mView = widget;
//bla bla..
}
public void openURL() {
super.onClick(mView);
}
}
我想我必须自定义 LinkMovementMethod class 但如何自定义?
任何评论将不胜感激。
更新:
我现在可以使用此代码处理触摸事件:
public class CustomLinkMovementMethod extends LinkMovementMethod {
private static CustomLinkMovementMethod sInstance;
@Override
public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
// Here I am changing backgorund color
if(event.getAction() == MotionEvent.ACTION_DOWN)
widget.setBackgroundColor(0xcccccccc);
if(event.getAction() == MotionEvent.ACTION_UP)
widget.setBackgroundColor(0xffffffff);
return super.onTouchEvent(widget, buffer, event);
}
public static MovementMethod getInstance() {
if (sInstance == null)
sInstance = new CustomLinkMovementMethod();
return sInstance;
}
}
但是TextView命名的widget,一个参数OnTouchEvent(),并不是我想要的。这是所有的文本。所以,当我触摸 link 时,文本完全变成灰色。我想我需要一些其他方法,例如通过查找 link.
的开始和结束行的坐标来为 link 着色背景
感谢您提出这个问题,我想我可能有一个解决方案。
查看 https://gist.github.com/qtyq/90f9b4894069a8b3676c
中的代码
它是 SpannableString 的工厂助手 class,它允许您通过以下方式轻松创建 SpannableString:
- 将原始字符串传递给静态 init(String s) 方法
- 调用makeLink(...)方法把你想要的子串变成link
- 可选择调用其他方法,如 makeBold(...)(已在 makeLink 中调用)或 setColor(...) 来自定义外观
- 最后调用 create() 来创建 SpannableString 对象,您可以使用 setText(...) 将其应用到您的 textView。
这是它的用法示例:
SpannableString ss = SpannableBuilder.init(bottomText)
.setColor("Terms & Conditions", getResources().getColor(R.color.orange))
.makeLink(getContext(), "Terms & Conditions", terms)
.setColor("Privacy Policy", getResources().getColor(R.color.orange))
.makeLink(getContext(), "Privacy Policy", policy)
.create();
textView1.setText(ss);
当然,您可以自定义 class 中已有的方法,或者如果需要进一步自定义,可以添加自己的方法,只需阅读 Google 的 SpannableString 文档即可了解更多信息关于你能做什么。
我有一个文本视图和 links。我希望 links 在我触摸它们时突出显示,并且我还想在我长按它们时打开一个警报对话框。我试图通过自定义 URLSpan 来解决这个问题,但是,由于在调用 OnClick 之前我无法访问 mView,所以我无法设置监听器:
class ConfirmSpan extends URLSpan{
View mView;
URLSpan span;
public ConfirmSpan(URLSpan span) {
super(span.getURL());
this.span = span;
//there is a nullpointerexception here since mView is null now.
mView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
((TextView)v).setBackgroundColor(0xcccccccc);
return false;
}
});
//this is also an exception
mView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
Log.d("INFO","long click yay!");
return false;
}
});
}
//this should be called to reach the view. But then I can't handle touch state.
@Override
public void onClick(View widget) {
mView = widget;
//bla bla..
}
public void openURL() {
super.onClick(mView);
}
}
我想我必须自定义 LinkMovementMethod class 但如何自定义? 任何评论将不胜感激。 更新: 我现在可以使用此代码处理触摸事件:
public class CustomLinkMovementMethod extends LinkMovementMethod {
private static CustomLinkMovementMethod sInstance;
@Override
public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
// Here I am changing backgorund color
if(event.getAction() == MotionEvent.ACTION_DOWN)
widget.setBackgroundColor(0xcccccccc);
if(event.getAction() == MotionEvent.ACTION_UP)
widget.setBackgroundColor(0xffffffff);
return super.onTouchEvent(widget, buffer, event);
}
public static MovementMethod getInstance() {
if (sInstance == null)
sInstance = new CustomLinkMovementMethod();
return sInstance;
}
}
但是TextView命名的widget,一个参数OnTouchEvent(),并不是我想要的。这是所有的文本。所以,当我触摸 link 时,文本完全变成灰色。我想我需要一些其他方法,例如通过查找 link.
的开始和结束行的坐标来为 link 着色背景感谢您提出这个问题,我想我可能有一个解决方案。
查看 https://gist.github.com/qtyq/90f9b4894069a8b3676c
中的代码它是 SpannableString 的工厂助手 class,它允许您通过以下方式轻松创建 SpannableString:
- 将原始字符串传递给静态 init(String s) 方法
- 调用makeLink(...)方法把你想要的子串变成link
- 可选择调用其他方法,如 makeBold(...)(已在 makeLink 中调用)或 setColor(...) 来自定义外观
- 最后调用 create() 来创建 SpannableString 对象,您可以使用 setText(...) 将其应用到您的 textView。
这是它的用法示例:
SpannableString ss = SpannableBuilder.init(bottomText)
.setColor("Terms & Conditions", getResources().getColor(R.color.orange))
.makeLink(getContext(), "Terms & Conditions", terms)
.setColor("Privacy Policy", getResources().getColor(R.color.orange))
.makeLink(getContext(), "Privacy Policy", policy)
.create();
textView1.setText(ss);
当然,您可以自定义 class 中已有的方法,或者如果需要进一步自定义,可以添加自己的方法,只需阅读 Google 的 SpannableString 文档即可了解更多信息关于你能做什么。