Android 如何在超链接上注册OnClickListner
我在aap中使用文本视图,它既有平面文本,也有超链接。现在,当我点击超链接,然后链接打开默认浏览器。但实际上我不想打开默认浏览器。实际上,我想在超级链接上注册OnClickListener,并执行其他操作 我在网上搜索,得到了这个解决方案 但这对我没有帮助 任何人都可以告诉我,我如何才能做到这一点Android 如何在超链接上注册OnClickListner,android,hyperlink,Android,Hyperlink,我在aap中使用文本视图,它既有平面文本,也有超链接。现在,当我点击超链接,然后链接打开默认浏览器。但实际上我不想打开默认浏览器。实际上,我想在超级链接上注册OnClickListener,并执行其他操作 我在网上搜索,得到了这个解决方案 但这对我没有帮助 任何人都可以告诉我,我如何才能做到这一点 提前感谢您可以使用Spannable对象 final Spannable span = new SpannableString(text); span.setSpan(new ClickableSp
提前感谢您可以使用
Spannable
对象
final Spannable span = new SpannableString(text);
span.setSpan(new ClickableSpan() {
@Override
public void onClick(View v) {
}
}, 0, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
当文本是超链接时可以使用
Spannable
对象
final Spannable span = new SpannableString(text);
span.setSpan(new ClickableSpan() {
@Override
public void onClick(View v) {
}
}, 0, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
其中文本是您的超链接如果此属性设置为XML,请删除android:autoLink=“web”
TextView textView =(TextView)findViewById(R.id.textView);
textView.setClickable(true);
如果要在浏览器中打开,请使用以下代码
textView.setMovementMethod(LinkMovementMethod.getInstance());
String text = "<a href='http://www.google.com'> Google </a>";
textView.setText(Html.fromHtml(text));
如果此属性设置为XML,则删除android:autoLink=“web”
TextView textView =(TextView)findViewById(R.id.textView);
textView.setClickable(true);
如果要在浏览器中打开,请使用以下代码
textView.setMovementMethod(LinkMovementMethod.getInstance());
String text = "<a href='http://www.google.com'> Google </a>";
textView.setText(Html.fromHtml(text));
尝试执行此添加
在你的
main.xml
<TextView
android:id="@+id/yourTVID"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="performSomeAction" />
尝试执行此添加
在你的
main.xml
<TextView
android:id="@+id/yourTVID"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="performSomeAction" />
试试这个,它会解决你的问题。此方法将返回一个可扩展字符串,该字符串的一部分可单击 在调用下面的方法之前,应该从字符串创建CharSequence,然后将其转换为Spanable
CharSequence charSequencce = testView.getText();
Spannable spannable = (Spannable) charSequencce;
public SpannableStringBuilder addClickToPartsOfString(Spannable charSequence, String[] stringsToAddClick, final OnHyperLinkClickListener onClickListener) {
SpannableStringBuilder ssb = new SpannableStringBuilder(charSequence);
for(final String s : stringsToAddClick) {
int index1 = charSequence.toString().indexOf(s);
int index2 = (s.length() + index1);
ssb.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
onClickListener.onClick(s);
}
}, index1, index2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return ssb;
}
试试这个,它会解决你的问题。此方法将返回一个可扩展字符串,该字符串的一部分可单击 在调用下面的方法之前,应该从字符串创建CharSequence,然后将其转换为Spanable
CharSequence charSequencce = testView.getText();
Spannable spannable = (Spannable) charSequencce;
public SpannableStringBuilder addClickToPartsOfString(Spannable charSequence, String[] stringsToAddClick, final OnHyperLinkClickListener onClickListener) {
SpannableStringBuilder ssb = new SpannableStringBuilder(charSequence);
for(final String s : stringsToAddClick) {
int index1 = charSequence.toString().indexOf(s);
int index2 = (s.length() + index1);
ssb.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
onClickListener.onClick(s);
}
}, index1, index2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return ssb;
}
我刚刚制作了一个图书馆,旨在简化这个过程。看见您可以通过以下代码实现相同的功能:
TextView locNotFound = Textoo
.config((TextView) findViewById(R.id.view_location_disabled))
.addLinksHandler(new LinksHandler() {
@Override
public boolean onClick(View view, String url) {
if ("internal://settings/location".equals(url)) {
Intent locSettings = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(locSettings);
return true;
} else {
return false;
}
}
})
.apply();
在内部,该库将文本视图/字符串资源中的现有链接(android系统已将字符串资源中的html链接解析为Span)转换为自定义ClickableSpan
,并将点击捕获为对处理程序的调用
这使您无需计算和硬编码要添加的可单击跨距的位置。这样可以更容易地将文本外部化为字符串资源,更好地进行本地化。我刚刚制作了一个库,旨在简化这一过程。看见您可以通过以下代码实现相同的功能:
TextView locNotFound = Textoo
.config((TextView) findViewById(R.id.view_location_disabled))
.addLinksHandler(new LinksHandler() {
@Override
public boolean onClick(View view, String url) {
if ("internal://settings/location".equals(url)) {
Intent locSettings = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(locSettings);
return true;
} else {
return false;
}
}
})
.apply();
在内部,该库将文本视图/字符串资源中的现有链接(android系统已将字符串资源中的html链接解析为Span)转换为自定义ClickableSpan
,并将点击捕获为对处理程序的调用
这使您无需计算和硬编码要添加的可单击跨距的位置。因此,可以更容易地将文本外部化为字符串资源,更好地进行本地化。可能重复的文本可以使用
SpannableString
和ClickableSpan
可能重复的文本可以使用SpannableString
和ClickableSpan
实际上,我的文本是纯文本和类似超链接的组合这项与中国签署的网络安全协议将使美国公司面临$AAPL的风险。但你给出的是整个文本视图的解决方案实际上我的文本是纯文本和超链接的组合,就像这样-中国网络安全协议将使美国公司易受攻击$AAPL。但您正在为整个TextView提供解决方案创建一个带有OnHyperLinkClickListener名称的接口,并编写抽象方法onClick(字符串s);公共接口OnHyperLinkClickListener{public void onClick(字符串子字符串);}在String[]stringsToAddClick参数中,必须传递要超链接的字符串部分。在ssb.setSpan()处获取异常。java.lang.IndexOutOfBoundsException:setSpan(-1…47)在0之前启动非常感谢您的快速回复。我使用SpannableStringBuilder:)创建一个带有OnHyperLinkClickListener名称的接口,并编写抽象方法onClick(字符串s);公共接口OnHyperLinkClickListener{public void onClick(字符串子字符串);}在String[]stringsToAddClick参数中,必须传递要超链接的字符串部分。在ssb.setSpan()处获取异常。java.lang.IndexOutOfBoundsException:setSpan(-1…47)在0之前启动非常感谢您的快速回复。我使用SpannableStringBuilder实现了这一点:)非常感谢您的快速回复。我做到了……:)非常感谢您的快速回复。我做到了……:)