gpt4 book ai didi

android - 用户单击 TextView 中的链接时如何 catch 异常?

转载 作者:太空狗 更新时间:2023-10-29 13:34:53 25 4
gpt4 key购买 nike

使用TextView显示邮件,并设置


TextView tvEmail = (TextView)this.findViewById(R.id.tvEmail);
Linkify.addLinks(tvEmail, Linkify.EMAIL_ADDRESSES);

点击上面的邮件地址会抛出一个异常,因为没有找到邮件客户端。如何 catch 这个异常(exception)?

最佳答案

我已经遇到了同样的问题,我通过创建一个检查 null 的新类解决了这个问题在实际启动 Intent 之前.

您所要做的就是替换所有URLSpan跨度,在设置 TextView 之前的文本(这意味着您不能使用 setAutoLinkMask() )。

必须这样做,因为 URLSpanonClick()方法不执行任何类型的 null检查。

如何进行:

TextView txt = ...
txt.setLinksClickable(true);
txt.setText(SafeURLSpan.parseSafeHtml(<<YOUR STRING GOES HERE>>));
txt.setMovementMethod(LinkMovementMethod.getInstance());

可以在 <<YOUR STRING GOES HERE>> 中使用的字符串种类:

"Click here: <a href=\"http://google.com\">My links</a>"
"Mail me: <a href=\"mailto:john@doe.com\">My email</a>"
... and so on...

这是 SafeURLSPan 的来源类(我在我的应用程序中使用它 FPlay ,并且已经在 Android 10+ 上进行了测试):

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.provider.Browser;
import android.text.Html;
import android.text.Spannable;
import android.text.style.URLSpan;
import android.view.View;

public final class SafeURLSpan extends URLSpan {
public SafeURLSpan(String url) {
super(url);
}

@Override
public void onClick(View widget) {
try {
final Uri uri = Uri.parse(getURL());
final Context context = widget.getContext();
final Intent intent = new Intent(Intent.ACTION_VIEW, uri);
if (context != null && intent != null) {
intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName());
context.startActivity(intent);
}
} catch (Throwable ex) {
}
}

public static CharSequence parseSafeHtml(CharSequence html) {
return replaceURLSpans(Html.fromHtml(html.toString()));
}

public static CharSequence replaceURLSpans(CharSequence text) {
if (text instanceof Spannable) {
final Spannable s = (Spannable)text;
final URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class);
if (spans != null && spans.length > 0) {
for (int i = spans.length - 1; i >= 0; i--) {
final URLSpan span = spans[i];
final int start = s.getSpanStart(span);
final int end = s.getSpanEnd(span);
final int flags = s.getSpanFlags(span);
s.removeSpan(span);
s.setSpan(new SafeURLSpan(span.getURL()), start, end, flags);
}
}
}
return text;
}
}

关于android - 用户单击 TextView 中的链接时如何 catch 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11699045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com