3

TextView を使用して電子メールを表示し、設定します


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

上記のメール アドレスをクリックすると、メール クライアントが見つからないため、例外が発生します。この例外に追いつく方法は?

4

1 に答える 1

2

私はすでに同じ問題を抱えていましたnull..Intent

のテキストを設定する前に、すべてのURLSpanスパンを置き換えるTextViewだけです (つまり、 は使用できませんsetAutoLinkMask())。

URLSpanのメソッドはいかなる種類のチェックonClick()も実行しないため、これを行う必要があります。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;
    }
}
于 2014-09-25T15:14:48.763 に答える