24

TextView選択可能でリンク化された が欲しいです。両方を行うと、テキストは選択可能になりますが、リンクをクリックすることはできません。

編集:

私が苦労していることを説明するコードを示します。

    TextView textView = view.findViewById(R.id.mytext);
    textView.setText("My text: +4412345678 Go to website: www.google.com Blah blah");
    Linkify.addLinks(textView, Linkify.ALL);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        textView.setTextIsSelectable(true);
    }
4

3 に答える 3

15

これを TextView xml コードに追加しようとしましたか?

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

私は自分のコードで試してみましたが、電話をかけたり、Web/メールでサーフィンしたり、すべてのテキストを選択したりできます。

于 2013-02-19T16:33:58.150 に答える
15

属性には厄介なバグがあります。autoLink電話番号の例をクリックしてから、戻って 2 番目の URL リンクをクリックすると、電話番号が再び開きます。この属性は複数のリンクではうまく機能しないため、独自のクラスを実装しました。Github ClickableLinksTextView.javaのリンクを次に示します。

あなたの例では、あなたのクラスをxml-layoutのTextView私のクラスに置き換えて、次のようにコードを変更することができます:ClickableLinksTextView

ClickableLinksTextView textView = (ClickableLinksTextView)view.findViewById(R.id.mytext);
textView.setText("My text: +4412345678 Go to website: www.google.com Blah blah");
Linkify.addLinks(textView, Linkify.ALL);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    textView.setMovementMethod(ArrowKeyMovementMethod.getInstance());
    textView.setTextIsSelectable(true);
    // the autoLink attribute must be removed, if you hasn't set it then ok, otherwise call textView.setAutoLink(0);
}

あなたの質問の問題の元の原因は、LinkMovementMethodクラスとtextIsSelectable属性にまったく互換性がないことです。Android OS 開発者でさえ、Android OS ソース コードでこれを認めています。

テキスト選択をサポートするテキストの移動方法を変更しないでください。任意のカーソル移動が妨げられます。

テキスト ビューが選択可能な場合、正しい移動方法の値はnullとの 2 つだけArrowKeyMovementMethodです。これがArrowKeyMovementMethod、私の例で明示的に設定した理由です。これLinkify.addLinksは、間違った移動方法を設定し、元に戻す必要があるためです。

autoLink 属性のバグについては、Android 開発者がリンク検出を適切にコピーしていないことが原因です。@cheng yang の回答のコード例を見ることができます。コードは、いくつあっても最初のリンクを取得します。

于 2013-04-14T19:21:39.607 に答える
2

問題はAndroidにありTextViewます。呼び出しLinkify.addLinks()ても、自動リンクマスク自体は変更されませんTextView。彼らがmAutoLinkMaskをチェックするのはAndroidのバグだと思います。したがって、ファイルに設定android:autoLinkするか、0以外の値を呼び出すと、機能します。xmlsetAutoLinkMask()

参考までに、TextViewのソースコード:

            if (touchIsFinished && mLinksClickable && mAutoLinkMask != 0 && textIsSelectable) {
            // The LinkMovementMethod which should handle taps on links has not been installed
            // on non editable text that support text selection.
            // We reproduce its behavior here to open links for these.
            ClickableSpan[] links = ((Spannable) mText).getSpans(getSelectionStart(),
                    getSelectionEnd(), ClickableSpan.class);

            if (links.length > 0) {
                links[0].onClick(this);
                handled = true;
            }
        }
于 2013-03-04T00:12:07.107 に答える