2015-04-02 26 views
8

enter image description hereZrób ciąg klikalny, podkreślony w TextView

Chcę, aby ciąg znaków „ten link” podkreślone i klikalny, ale nie wiem, jak to osiągnąć.

plik XML:

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

W moim fragmentu:

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

Nie chcę cały ciąg być klikalne, tylko podkreślony fragment. Nie mogę użyć poziomego LinearLayout z 2 komórkami, ponieważ na mniejszych urządzeniach ciąg nie będzie wyglądał tak, będzie podzielony na 2 komórki.

co ja próbowałem:

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

Powyższy kod sprawia, że ​​cały ciąg podkreślony a także kolor tekstu zmienia się jasnoniebieskim.

+0

Można użyć 'HTML.fromHTML' i wstawić' this link 'do łańcucha znaków. –

Odpowiedz

6

problemem jest to, że ustawiasz rozpiętość do całego łańcucha (sp.setSpan(click, 0, sp.length()). Aby to naprawić, musisz ustawić zakres klikalności tylko na this link. Zrobiłem to samo w ten sposób:

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

w swojej działalności

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

gdzie startIndex oraz endIndex są indeksem thisLink w yourString. Rozdzieliłem dwa ciągi, ponieważ łatwiej było wyszukiwać indeksy, szczególnie jeśli chodzi o tłumaczenia. Aby obliczyć startIndex, możesz użyć yourString.indexOf(thisLink), a endIndex to startIndex + the length of thisLink. Zostawię wam zwykłe kontrole, (ujemne indeksy, a wszystko inne, które mogą spowodować takie IndexOutBoundException) wartość zmiany

-1

Można spróbować z poniższym kodzie ..

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

za obsługę zdarzenia kliknięcia w TextView z poniższej metodzie

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

Nie ma to żadnego skutku, ponieważ oryginalny ciąg nie zawiera adresu URL ... Przeczytaj uważnie to pytanie. – 2Dee

+0

proszę sprawdzić zmodyfikowaną odpowiedź. –

2

można zdefiniować w strings.xml

<string name="submitText">Before you submit, please check out <a href="actual url">this link</a> 
1
<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" /> 

w działalności // próbki

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

sprawdzić tutaj for more detailed answer

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

0: pozycja rozpocząć z linku w tekście, przykładową wartość zmienia się z: 10 jeśli ciebie ustaw 0 spowoduje hiperłączenie całego tekstu.