2012-03-24 17 views
40

so che se si mette un anello di una TextView che funzionerà, ma se voglio visualizzare, ad esempio:Android: TextView hyperlink

google StackOverflow

e non l'intero collegamento (solo il tag) Come faccio a rendere cliccabili quei link?

+0

Controlla questo: http://stackoverflow.com/a/2746708/646391 – Emran

+0

possibile duplicato di [Come faccio a fare clic su collegamenti TextView?] (Http://stackoverflow.com/questions/2734270/how-do-i-make-links-in-a-textview-clickable) – CAMOBAP

+0

Diverse delle risposte qui richiamano Html.fromHtml e non utilizzare strings.xml per l'ipertesto o offuscare l'ipertesto nell'XML (ad es. "<" sostituendo "<" nel file XML). Ciò complica inutilmente le cose. AFAICT, la risposta più corretta sarebbe quella di digitare il tag di ancoraggio HTML direttamente in strings.xml, assicurarsi che la proprietà di autolink per TextView non sia impostata, quindi utilizzare setMovementMethod per impostare LinkMovementMethod. Ci sono un paio di risposte che mostrano già come farlo. –

risposta

58

Si potrebbe avere due TextViews separati e si potrebbe allineare di conseguenza nel layout, se necessario:

Text1.setText(
     Html.fromHtml(
      "<a href=\"http://www.google.com\">google</a> ")); 
    Text1.setMovementMethod(LinkMovementMethod.getInstance()); 

    Text2.setText(
      Html.fromHtml(
       "<a href=\"http://www.stackoverflow.com\">stackoverflow</a> ")); 
    Text2.setMovementMethod(LinkMovementMethod.getInstance()); 

Poi, se si vuole mettere a nudo il "legame sottolineatura". Creare una classe:

public class URLSpanNoUnderline extends URLSpan { 
    public URLSpanNoUnderline(String url) { 
     super(url); 
    } 
    @Override public void updateDrawState(TextPaint ds) { 
     super.updateDrawState(ds); 
     ds.setUnderlineText(false); 
     } 
} 

Quindi aggiungere questo metodo nella classe di attività principale in cui si hanno le TextViews

private void stripUnderlines(TextView textView) { 
    Spannable s = new SpannableString(textView.getText()); 
    URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class); 
    for (URLSpan span: spans) { 
     int start = s.getSpanStart(span); 
     int end = s.getSpanEnd(span); 
     s.removeSpan(span); 
     span = new URLSpanNoUnderline(span.getURL()); 
     s.setSpan(span, start, end, 0); 
    } 
    textView.setText(s); 
} 

E poi basta chiamare questo dopo aver inizializzato le TextViews (nel onCreate):

stripUnderlines(Text1); 
stripUnderlines(Text2); 
+1

Nota: questo ** non ** funzionerà se hai impostato nelle proprietà di TextView l'autolink di alcune proprietà! Se lo hai, devi chiamare 'textView.setAutoLinkMask (0);' prima di chiamare setText() – Xebozone

5

questo dovrebbe funzionare.

TextView t2 = (TextView) findViewById(R.id.text2); 
t2.setMovementMethod(LinkMovementMethod.getInstance()); 

and 

<TextView android:layout_width="wrap_content" 
android:layout_height="wrap_content" android:text="@string/txtCredits" 
android:id="@+id/text2" 
android:layout_centerInParent="true" 
android:layout_marginTop="20dp"></TextView> 
+0

Ma non voglio mostrare l'intero link –

+0

sì e per questo è possibile includere questo nella risorsa stringa Google. –

+0

Lo provo! Grazie! –

11

modo molto semplice per fare questo ---

Nella tua Activity--

TextView tv = (TextView) findViewById(R.id.site); 
tv.setText(Html.fromHtml("<a href=http://www.stackoverflow.com> STACK OVERFLOW ")); 
tv.setMovementMethod(LinkMovementMethod.getInstance()); 

Poi si aprirà solo il tag, non l'intero collegamento ..

Spero che vi aiuterà a ...

45
TextView t2 = (TextView) findViewById(R.id.textviewidname); 
t2.setMovementMethod(LinkMovementMethod.getInstance()); 

e

<string name="google_stackoverflow"><a href="https://stackoverflow.com/questions/9852184/android-textview-hyperlink?rq=1">google stack overflow</a></string> 

Il link è "Android: textview hyperlink"

e il tag è "google stack overflow"

Definire il primo blocco di codice nel java e il secondo blocco di codice nel file strings.xml. Inoltre, assicurati di fare riferimento all'ID di textView dal layout di pagina in java.

+2

mi piace il tuo modo migliore. IMHO è il più pulito. – plackemacher

+1

Sono felice di essere al servizio. – epicness42

+0

Funziona con più collegamenti. ad esempio Esempi: Link 1 e Link 2 Peter

2

Questa è la mia implementazione di lavoro

private void showMessage() 
    { 

     lblMessage.setText(""); 

     List<String> messages = db.getAllGCMMessages(); 

     for (int k = messages.size() - 1; k >= 0; --k) 
     { 

      String message = messages.get(k).toString(); 
      lblMessage.append(message + "\n\n"); 

     } 
    Linkify.addLinks(lblMessage, Linkify.ALL); 
    } 

e di cambiare il colore dei collegamenti ipertestuali, i Editted mia XML per TextView -

android:textColorLink="#69463d" 
2

mi ha colpito sul lo stesso problema e trovare finalmente la soluzione di lavoro.

  1. nella stringa.file XML, definire:

    <string name="textWithHtml">The URL link is &lt;a href="http://www.google.com">Google&lt;/a></string> 
    

sostituire la "<" meno di personaggio con HTML sfuggito carattere.

  1. Nel codice Java:

    String text = v.getContext().getString(R.string.textWithHtml); 
    textView.setText(Html.fromHtml(text)); 
    textView.setMovementMethod(LinkMovementMethod.getInstance()); 
    

E il TextBox verrà visualizzato correttamente il testo con link cliccabile di ancoraggio

7

android:autoLink="web" funziona semplicemente se avete link completi nel tuo codice HTML. Quanto segue sarà evidenziato in blu e cliccabile: