web-dev-qa-db-ja.com

TextViewで下線を引いて、文字列をクリック可能にします

enter image description here

文字列「このリンク」に下線を引いてクリックできるようにしたいのですが、それを実現する方法がわかりません。

XMLファイル:

<string name="submitText">Before you submit, please check out &lt;u>this link&lt;/u></string>

私の断片では:

tvSubmit.setText(Html.fromHtml(getString(R.string.submitText)));

文字列全体をクリック可能にしたくはありません。下線付きのセクションのみを表示します。 2つのセルで水平方向のLinearLayoutを使用することはできません。小さいデバイスでは、文字列の外観が継続せず、2つのセルに分割されるためです。

私は何を試しましたか:

tvSubmit.setMovementMethod(LinkMovementMethod.getInstance());
Spannable sp = (Spannable) tvSubmit.getText();
ClickableSpan click = new ClickableSpan() {
    @Override
    public void onClick(View widget) {
        showLink();
    }
};
sp.setSpan(click, 0, sp.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

上記のコードでは、文字列全体に下線が引かれ、テキストの色も水色に変更されます。

12

問題は、スパンを文字列全体に設定していることです(sp.setSpan(click, 0, sp.length())。修正するには、_this link_でのみクリック可能なスパンを設定する必要があります。私はこのように同じことをしました:

_<string name="submitText">Before you submit, please check out %1$s</string>
<string name="this_link">this link</string>
_

あなたの活動で

_String thisLink = getString(R.string.thisLink);
String yourString = getString(R.string.submitText, thisLink);
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(yourString);
spannableStringBuilder.setSpan(click,
                startIndex, endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
_

ここで、startIndexとendIndexは、thisLink内のyourStringのインデックスです。特に翻訳を処理する必要がある場合は、インデックスを探すのが簡単だったので、2つの文字列を分離しました。 startIndexを計算するには、yourString.indexOf(thisLink)を使用でき、endIndexは_startIndex + the length of thisLink_です。通常のチェック(負のインデックス、およびIndexOutBoundExceptionを引き起こす可能性のあるその他すべて)はお任せします

8
Blackbelt

あなたはあなたのstrings.xmlで定義することができます

<string name="submitText">Before you submit, please check out <a href="actual url">this link</a>
3
Satty
 <TextView  
       Android:id="@+id/tvSubmit"  
       Android:layout_width="wrap_content"  
       Android:layout_height="wrap_content"  
       Android:layout_alignParentTop="true"  
       Android:autoLink=@String/submitText //link the content of web  
       Android:textColorLink="#576586" //change the color of the link  
       Android:textColor="#555555" />

アクティビティ中//サンプル

String webLinkText = <a href="https://prativas.files.wordpress.com/2013/05/screenshot-mozilla-firefox-private-browsing.png"><img src="https://prativas.files.wordpress.com/2013/05/screenshot-mozilla-firefox-private-browsing.png" alt="Screenshot-Mozilla Firefox (Private Browsing)" width="293" height="254" class="alignnone size-full wp-image-291" /></a>  
 tvSubmit = (TextView) findViewById(R.id.tvSubmit);  
 tvSubmit.setText(Html.fromHtml(webLinkText))); 

ここをチェックしてください より詳細な答えについては

1
Karthika PB

クリック可能なテキストをtextviewに追加するのに役立つこの関数を作成しました:

public static SpannableStringBuilder getSpannablableClickFor(CharSequence initialText, ClickableSpan click, String textToAppend) {
    String description = String.format("%s %s", initialText, textToAppend);
    SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(description);
    int start = description.indexOf(textToAppend);
    int end = start + textToAppend.length();
    spannableStringBuilder.setSpan(click,
            start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    spannableStringBuilder.setSpan(new StyleSpan(Android.graphics.Typeface.BOLD), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    spannableStringBuilder.setSpan(new UnderlineSpan(), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    final ForegroundColorSpan fcs = new ForegroundColorSpan(Color.WHITE);
    spannableStringBuilder.setSpan(fcs, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    return spannableStringBuilder;
}
0
Z3nk
sp.setSpan(click, 0, sp.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

値0を変更:テキスト内の位置開始リンクを使用します。例:値を10に変更すると、0を設定すると、すべてのテキストがハイパーリンクされます。