2013-02-13 26 views
22

Chciałbym mieć TextView, który można wybierać i używać pod kontrolą. Kiedy to zrobię, otrzymam tekst do wybrania, ale nie można kliknąć łącza.TextView, który jest wspierany i wybierany?

EDIT:

pokażę kod, aby wyjaśnić, co walczę:

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

Co robisz, to nie działa? Czy próba zmotywowania go do działania jest tylko pracą? –

+0

Kiedy robię to pod kontrolą, mogę klikać na adresy URL i telefony. Ale kiedy go zaznaczę, klikanie nie jest już możliwe – pixel

Odpowiedz

15

Próbowałeś dodać to na TextView kodu xml?

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

Próbowałem go na moim kodzie i mogę wykonać połączenie/surfować po Internecie/mailu, a także zaznaczyć cały tekst.

+0

Tak więc chodzi tylko o pompowanie wcześniej przygotowanego 'textView' (jak' textView = inflater.inflate (R.layout.linkify_text_view, null) '), ponieważ nie działa poprawnie podczas dodawania to przez kod. Sprawdź również http: // commonsware.com/blog/2013/10/23/linkfy-autolink-need-custom-urlspan.html – Stan

2

Problem dotyczy Androida TextView. Wywołanie Linkify.addLinks() nie zmieniłoby maski automatycznej maski w samym TextView. Myślę, że to błąd Androida, który sprawdza mAutoLinkMask. Jeśli więc ustawisz android:autoLink w pliku xml lub wywołasz setAutoLinkMask() na wartość inną niż 0, to zadziała.

FYI, kod źródłowy 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

Atrybut autoLink ma przykry błąd: jeśli klikniesz w przykładzie numerem telefonu, a następnie wrócić i kliknij na drugim linku URL - go ponownie otworzy numer telefonu. Ten atrybut działa tak źle z wielu linków, że wdrożyliśmy własną klasę, tu jest link na Github ClickableLinksTextView.java

W przykładzie można zastąpić klasę TextView przez mojego ClickableLinksTextView klasy w xml-układ i zmienić kod tak:

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

pierwotną przyczyną problemu w Twoim pytaniem jest to, że klasa LinkMovementMethod i atrybut textIsSelectable nie są kompatybilne w ogóle, nawet programiści Android OS przyznać w the Android OS source code.

Nie zmieniaj metody przemieszczania dla tekstu, który obsługuje zaznaczanie tekstu, ponieważ może to zapobiec dowolnemu przesunięciu kursora.

Jeśli widok tekst jest wybierane, tylko 2 prawidłowe wartości metoda ruchowe są null i ArrowKeyMovementMethod. Właśnie dlatego w moim przykładzie ustawiłem jawnie ArrowKeyMovementMethod, ponieważ Linkify.addLinks ustawia niepoprawną metodę ruchu i powinienem ją przywrócić.

Co do błędu atrybutu autoLink, to dlatego, że programiści Android nie prawidłowo skopiowali wykrywanie linków. Możesz spojrzeć na przykład kodu w odpowiedzi na @cheng yang, kod po prostu bierze pierwszy link bez względu na to, ile masz.

+0

textView.setMovementMethod (ArrowKeyMovementMethod.getInstance()); to jest to, czego potrzebowałem, aby to dla mnie zadziałało. –

+0

Używam go razem z moimi własnymi adresami URL mieszanymi z innymi niestandardowymi rozpiętościami, a Twoja klasa działa świetnie. Dziękujemy za udostępnienie! Btw nie ma potrzeby, aby rzucić go jawnie do ClickableLinksTextView, ponieważ api TextView pozostaje nietknięty. – Makibo

+0

Wielkie dzięki bardzo pomaga –