2013-02-13 10 views
22

Mi piacerebbe avere un TextView che sia sia selezionabile sia linkificato. Quando faccio entrambi, ho finito con testo selezionabile ma i collegamenti non possono essere cliccati.TextView che è collegato e selezionabile?

EDIT:

ti faccio vedere il codice di spiegare con quello che faccio fatica:

TextView textView = view.findViewById(R.id.mytext); 
    textView.setText("My text: +4412345678 Go to website: www.google.com Blah blah"); 
    Linkify.addLinks(textView, Linkify.ALL); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
     textView.setTextIsSelectable(true); 
    } 
+0

Cosa stai facendo che non funziona? Il tentativo di renderlo collegato funziona solo? –

+0

Quando effettuo il collegamento, posso fare clic su url e telefoni. Ma quando lo faccio selezionabile non è più possibile fare clic su – pixel

risposta

15

Hai cercato di aggiungere questo sul vostro codice XML TextView?

<TextView 
    ... 
    android:autoLink="all" 
    android:textIsSelectable="true" /> 

Ho provato sul mio codice e posso effettuare una chiamata/navigare su web/mail e anche selezionare tutto il testo.

+0

Quindi si tratta solo di gonfiare 'textView' precedentemente preparato (come' textView = inflater.inflate (R.layout.linkify_text_view, null) ') poiché non funziona correttamente quando si aggiunge tramite codice Controlla anche questo http: // commonsware.com/blog/2013/10/23/linkify-autolink-need-custom-urlspan.html – Stan

2

Il problema è in Android TextView. Chiamando Linkify.addLinks() non si modificava la maschera di mascheramento automatico nello stesso TextView. Penso che sia un bug di Android che controllano mAutoLinkMask. Quindi se si imposta android:autoLink nel file xml o si chiama setAutoLinkMask() con un valore diverso da 0, funzionerà.

Cordiali saluti, il codice sorgente TextView s':

  if (touchIsFinished && mLinksClickable && mAutoLinkMask != 0 && textIsSelectable) { 
      // The LinkMovementMethod which should handle taps on links has not been installed 
      // on non editable text that support text selection. 
      // We reproduce its behavior here to open links for these. 
      ClickableSpan[] links = ((Spannable) mText).getSpans(getSelectionStart(), 
        getSelectionEnd(), ClickableSpan.class); 

      if (links.length > 0) { 
       links[0].onClick(this); 
       handled = true; 
      } 
     } 
13

L'attributo autoLink ha un fastidioso bug: se si fa clic nel tuo esempio il numero di telefono, per poi tornare indietro e fare clic sul secondo link URL - è riaprirà il numero di telefono. Questo attributo funziona così male con collegamenti multipli, che ho implementato mia classe, ecco il link su Github ClickableLinksTextView.java

Nel tuo esempio è possibile sostituire la classe TextView dal mio ClickableLinksTextView classe nel xml-layout e modificare il codice in questo modo:

ClickableLinksTextView textView = (ClickableLinksTextView)view.findViewById(R.id.mytext); 
textView.setText("My text: +4412345678 Go to website: www.google.com Blah blah"); 
Linkify.addLinks(textView, Linkify.ALL); 

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
    textView.setMovementMethod(ArrowKeyMovementMethod.getInstance()); 
    textView.setTextIsSelectable(true); 
    // the autoLink attribute must be removed, if you hasn't set it then ok, otherwise call textView.setAutoLink(0); 
} 

la causa originale del problema nella tua domanda è che la classe LinkMovementMethod e l'attributo textIsSelectable non sono compatibili a tutti, anche gli sviluppatori di Android OS ammettono questo the Android OS source code.

Non modificare il metodo di spostamento per il testo che supporta la selezione del testo poiché impedirebbe uno spostamento arbitrario del cursore.

Se la vista testo è selezionabile, gli unici 2 valori metodo corretto movimento sono null e ArrowKeyMovementMethod. Ecco perché nel mio esempio ho impostato ArrowKeyMovementMethod esplicitamente, perché lo Linkify.addLinks imposta un metodo di spostamento errato e dovrei ripristinarlo.

Per quanto riguarda il bug dell'attributo autoLink, è perché gli sviluppatori Android non hanno copiato correttamente il rilevamento dei collegamenti. Puoi guardare l'esempio di codice nella risposta di @cheng yang, il codice prende solo il primo link, non importa quanti di loro hai.

+0

textView.setMovementMethod (ArrowKeyMovementMethod.getInstance()); è quello di cui avevo bisogno per farlo funzionare per me. –

+0

Utilizzato insieme ai miei URLSpans mescolati con altre campate personalizzate e la tua classe funziona alla grande. Grazie per averlo fornito! Non c'è bisogno di lanciarlo esplicitamente su ClickableLinksTextView poiché l'api TextView non viene toccata. – Makibo

+0

Grazie mille aiuta molto –

Problemi correlati