11

これをTextView呼び出してデータセットを取得するがあります:

tv.setText(Html.fromHtml(myText));

文字列myTextには、部分的にフォーマットされた html データが含まれています。たとえば、フォント タグはあるが、タグを使用してフォーマットされた URL リンクがない場合があり<a href=...>ます。Linkify.addLinks(...)私のテキストには、Linkify が適切に変換する他の種類のリンクが含まれている可能性があるため、を使用してそれを行うことを望んでいました。だから私はこのように見えるように私のコードを書きました:

String myText = "<font color=\"red\">Red text</font> and Url: www.google.com";
tv.setText(Html.fromHtml(myText));
Linkify.addLinks(tv, Linkify.ALL);
tv.setMovementMethod(LinkMovementMethod.getInstance());

これは正しく動作しません。つまり、フォントタグは処理しますが、Linkify は URL をUrlSpan適切に変換しません。

あるいは、Html.fromHtml(..) なしで setText() を呼び出すと、Linkify は機能しますが、html フォント タグから書式設定されたすべてのテキストが失われます。どういうわけか、それらは両方とも矛盾しているように見え、私はどちらか一方しか持つことができません.

ここに私が理解していない興味深い部分があります。Java から Linkify コードを削除し、私のレイアウト xml に移動して、そこに次の行を追加すると、すべてが機能しているように見えます (Linkify と fromHtml の両方が一緒にうまく動作することになります...どういうわけか)

<TextView
    ... 
    android:autoLink="all"
    android:linksClickable="true"
    ...
/>

なぜそれがすべてを機能させるのか、誰かが私に説明できますか??

TextView のソースコードを調べたsetMovementMethod()ところ、最終的に次のように呼び出されました。

setFocusable(true);
setClickable(true);
setLongClickable(true);

これにより、理論的にはすべてが機能し、xml レイアウト コードと同じように動作するはずです。Linkify.addLinks(..)以前Javaコードで呼び出す順番を入れ替えてみsetText(Html.fromHtml(..))ましたが、変わりませんでした。

java で Linkify.addLinks() と Html.fromHtml() を組み合わせるとこの動作が発生する理由についてのアイデアはありますが、xml レイアウトでは発生しませんか?

4

3 に答える 3

21

これは、テキストを処理する前に前のスパンHtml.fromHtmlを削除するためです。Linkify.addLinks

このコードを使用して機能させます。

public static Spannable linkifyHtml(String html, int linkifyMask) {
    Spanned text = Html.fromHtml(html);
    URLSpan[] currentSpans = text.getSpans(0, text.length(), URLSpan.class);

    SpannableString buffer = new SpannableString(text);
    Linkify.addLinks(buffer, linkifyMask);

    for (URLSpan span : currentSpans) {
        int end = text.getSpanEnd(span);
        int start = text.getSpanStart(span);
        buffer.setSpan(span, start, end, 0);
    }
    return buffer;
}
于 2013-06-19T21:08:10.637 に答える
2

これを試すことができます:

最初にテキストを TextView に設定します。

tv.setText(myText);

Linkifyでリンクを変換する

Linkify.addLinks(tv, Linkify.ALL);

最後に、テキストを Html.fromHtml に置き換えますが、EditText の Linkified テキストを使用します。

tv.setText(Html.fromHtml(tv.getText().toString()));
于 2015-04-24T15:21:17.303 に答える