做一个字符串点击,在一个TextView

问题描述:

enter image description here做一个字符串点击,在一个TextView

我要让字符串“此链接”下划线下划线和点击,但我不知道如何来实现这一目标。

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

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

+0

您可以使用'HTML.fromHTML'并在您的字符串中插入'this link'。 – 2015-04-02 08:46:13

的问题是,你的跨度设置为整个字符串(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

你可以用下面的代码试试..

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

处理Click事件中的TextView用下面的方法

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; 
    } 
+0

这没有效果,因为原始字符串实际上并不包含网址......请仔细阅读问题。 – 2Dee 2015-04-02 09:16:12

+0

请检查修改后的答案。 – 2015-04-02 10:28:33

你可以在你的strings.xml定义

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

<TextView 
     android:id="@+id/tvSubmit" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:[email protected]/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

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

变化值0:如果你10 :带位置开始的文本与链接,例如变化值设置为0,它会超链接所有的文本。