使字符串可单击,在TextView中加下划线

时间:2015-04-02 08:37:05

标签: android hyperlink textview underline

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);

上面的代码使整个字符串加下划线,文本的颜色也变为淡蓝色。

8 个答案:

答案 0 :(得分:8)

问题是您要将跨度设置为整个字符串(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是thisLinkyourString的索引。我把这两个字符串分开了,因为它更容易查找索引,特别是如果你必须处理翻译。要计算startIndex,您可以使用yourString.indexOf(thisLink),endIndex为startIndex + the length of thisLink。我将给你留下普通的支票,(负面索引,以及可能导致IndexOutBoundException的其他一切)

答案 1 :(得分:3)

您可以在strings.xml中定义

<string name="submitText">Before you submit, please check out <a href="actual url">this link</a>

答案 2 :(得分:1)

 <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))); 

点击for more detailed answer

答案 3 :(得分:1)

就我而言,我需要一个本地化的字符串,其中的一部分是可点击的。 我所做的是在我的资源中定义一个字符串(每个语言环境一个),可点击部分带有下划线,如下所示:

<string name="my_message">Blah blah blah <u>call us</u> blah blah.</string>

然后我创建了一个扩展来查找带下划线的文本并在其上添加可点击的跨度,如下所示:

fun CharSequence.makeUnderlineClickable(listener: (index: Int) -> Unit): SpannableString {
    val spannedString = SpannableString(this)
    spannedString.getSpans(0, length, UnderlineSpan::class.java)?.forEachIndexed { index, underlineSpan ->
        val clickableSpan = object : ClickableSpan() {
            override fun onClick(widget: View) {
                listener.invoke(index)
            }

            override fun updateDrawState(ds: TextPaint) {
                ds.isUnderlineText = true
            }
        }
        spannedString.setSpan(
            clickableSpan,
            spannedString.getSpanStart(underlineSpan),
            spannedString.getSpanEnd(underlineSpan),
            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
        )
    }
    return spannedString 
}

你可以这样使用它:

    textView.text = resources.getText(R.string.my_message).makeUnderlineClickable { index ->
        //handle click here
    }
    textView.movementMethod = LinkMovementMethod.getInstance()
    textView.highlightColor = Color.TRANSPARENT

答案 4 :(得分:0)

sp.setSpan(click, 0, sp.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

更改值0:文本中的位置开始链接,示例更改值为:10 如果设置为0,它将超链接所有文本。

答案 5 :(得分:0)

只是做了此功能来帮助我将可点击的文本附加到textview中:

refresh()

答案 6 :(得分:0)

您可以尝试使用 Kotlin 扩展功能来创建类似文本且带有下划线的可点击。

fun TextView.colorSpannableStringWithUnderLineOne(
    prefixString: String,
    postfixString: String,
    callback: (Int) -> Unit
) {
    val spanTxt = SpannableStringBuilder()
    spanTxt.append("$prefixString ")
    spanTxt.append(" $postfixString")
    spanTxt.setSpan(object : ClickableSpan() {
        override fun onClick(widget: View) {
            callback(0)
            widget.invalidate()
        }

        override fun updateDrawState(ds: TextPaint) {
            ds.color = ContextCompat.getColor(context, R.color.highlight)
            ds.isUnderlineText = true
        }
    }, prefixString.length, spanTxt.length, 0)
    this.movementMethod = LinkMovementMethod.getInstance()
    this.setText(spanTxt, TextView.BufferType.SPANNABLE)
}

`

如何使用:

textViewLink.colorSpannableStringWithUnderLineOne(
                "Normal string",
                "Clickable string",
                callback = {
                    JLog.e("==>","Clicked")
                })
  textViewLink.invalidate()

答案 7 :(得分:-1)

您可以尝试使用以下代码..

String str = "Before you submit, please check out this link";
tvSubmit.setMovementMethod(LinkMovementMethod.getInstance());
tvSubmit.setText(setClickablePart(str), BufferType.SPANNABLE);

使用以下方法

处理Textview中的Click事件
 private SpannableStringBuilder setClickablePart(String str)
    {
        SpannableStringBuilder m_spannableStringBuilder = new SpannableStringBuilder(str);

        int m_index = str.indexOf("this");

        final String clickString = str.substring(m_index, str.length());
        m_spannableStringBuilder.setSpan(new ClickableSpan()
        {
            @Override
            public void onClick(View widget)
            {
                Toast.makeText(MainActivity.this, clickString, Toast.LENGTH_SHORT).show();
            }
        }, m_index, str.length(), 0);

        return m_spannableStringBuilder;
    }