2013-02-13 6 views
22

Ich möchte eine TextView haben, die sowohl auswählbar als auch verknüpft ist. Wenn ich beides mache, habe ich einen auswählbaren Text, aber die Links können nicht angeklickt werden.TextView, das verlinkt und auswählbar ist?

EDIT:

ich den Code zeigen werde mit zu erklären, was ich kämpfen:

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

Was machst du das funktioniert nicht? Macht der Versuch, es verlinkt zu machen, nur Arbeit? –

+0

Wenn ich es verlinkt habe, kann ich auf URLs und Telefone klicken. Aber wenn ich es auswählbaren Klick machen kann nicht mehr – pixel

Antwort

15

Haben Sie versucht, diese XML-Code auf Ihrem Textview hinzufügen?

Ich habe es auf meinem Code versucht und ich kann einen Anruf/surfen auf Web/Mail und auch wählen Sie den gesamten Text.

+0

So ist es nur über zuvor hergestelltes Aufpumpen 'textView' (wie' Textview = inflater.inflate (R.layout.linkify_text_view, null) '), da es nicht richtig funktioniert, wenn das Hinzufügen es über den Code. Überprüfen Sie auch diese http: // commonsware.com/blog/2013/10/23/Linkify-Autolink-need-custom-urlspan.html – Stan

2

Das Problem ist in Android TextView. Der Aufruf von Linkify.addLinks() würde die Autolinkmaske in TextView selbst nicht ändern. Ich denke, es ist ein Android-Fehler, dass sie mAutoLinkMask überprüfen. Also, wenn Sie android:autoLink in xml Datei oder setAutoLinkMask() auf einen Wert ungleich 0 setzen, wird es funktionieren.

FYI, TextView ‚s-Quellcode:

  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

Das autoLink Attribut hat einen ärgerlichen Fehler: Wenn Sie unter der Telefonnummer in Ihrem Beispiel klicken, dann kehren Sie zurück und klicken Sie auf dem zweiten URL-Link - es öffnet die Telefonnummer erneut. Dieses Attribut funktioniert so schlecht, mit mehreren Links, dass ich meine eigene Klasse implementiert habe, hier ist der Link auf Github ClickableLinksTextView.java

In Ihrem Beispiel können Sie Ihre TextView Klasse von meiner ClickableLinksTextView Klasse in dem XML-Layout ersetzen und den Code ändern dies wie:

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

die ursprüngliche Ursache des Problems in Ihrer Frage ist, dass die LinkMovementMethod Klasse und das textIsSelectable Attribut überhaupt nicht kompatibel, auch Android OS Entwickler zugeben dies in the Android OS source code.

Sie für Text nicht die Methode Bewegung ändern, die Textauswahl zu unterstützen, da sie eine beliebige Cursor Verschiebung verhindern würde.

Wenn die Textansicht ist wählbar, die nur 2 korrekte Bewegung Methode Werte sind null und ArrowKeyMovementMethod. Deshalb setze ich in meinem Beispiel explizit ArrowKeyMovementMethod, weil die Linkify.addLinks eine falsche Bewegungsmethode einstellt und ich sie zurücksetzen sollte.

Was den Fehler des Attributs autoLink betrifft, liegt das daran, dass Android-Entwickler die Link-Erkennung nicht korrekt kopiert haben. Sie können das Codebeispiel in der Antwort von @cheng yang betrachten, der Code nimmt nur den ersten Link, egal wie viele von ihnen Sie haben.

+0

textView.setMovementMethod (ArrowKeyMovementMethod.getInstance()); ist das, was ich brauchte, um es für mich arbeiten zu lassen. –

+0

es zusammen mit meinem eigenen URLSpans Verwendung mit anderen benutzerdefinierten Spannweiten gemischt und Ihre Klasse funktioniert super. Danke für die Bereitstellung! Übrigens muss es nicht explizit in ClickableLinksTextView umgewandelt werden, da die TextView API unberührt bleibt. – Makibo

+0

Vielen Dank es viel –

Verwandte Themen