Obecnie renderuję dane wejściowe HTML w TextView w następujący sposób:
tv.setText(Html.fromHtml("<a href='test'>test</a>"));
Wyświetlany kod HTML jest dostarczany za pośrednictwem zewnętrznego zasobu, więc nie mogę zmieniać rzeczy tak, jak chcę, ale mogę oczywiście zmodyfikować kod HTML, aby zmienić wartość href, powiedzmy, na coś innego.
Chcę mieć możliwość obsługi kliknięcia łącza bezpośrednio w aplikacji, zamiast otwierania go w oknie przeglądarki. Czy jest to w ogóle możliwe? Domyślam się, że byłoby możliwe ustawienie protokołu wartości href na coś takiego jak „myApp: //”, a następnie zarejestrowanie czegoś, co pozwoliłoby mojej aplikacji obsłużyć ten protokół. Jeśli to rzeczywiście najlepszy sposób, chciałbym wiedzieć, jak to się robi, ale mam nadzieję, że jest łatwiejszy sposób, aby po prostu powiedzieć: „po kliknięciu linku w tym widoku tekstu chcę zgłosić zdarzenie, które odbiera wartość href linku jako parametr wejściowy „
Odpowiedzi:
Idąc do tego prawie rok później, jest inny sposób, w jaki rozwiązałem mój konkretny problem. Ponieważ chciałem, aby link był obsługiwany przez moją własną aplikację, istnieje rozwiązanie, które jest nieco prostsze.
Oprócz domyślnego filtru intencji, po prostu pozwalam mojej docelowej aktywności słuchać
ACTION_VIEW
intencji, a konkretnie tych ze schematemcom.package.name
Oznacza to, że linki zaczynające się od
com.package.name://
będą obsługiwane przez moją aktywność.Wszystko, co muszę zrobić, to stworzyć adres URL zawierający informacje, które chcę przekazać:
W mojej docelowej aktywności mogę pobrać ten adres:
W moim przykładzie mógłbym po prostu sprawdzić
data
wartości null, ponieważ jeśli kiedykolwiek nie jest to null, będę wiedział, że zostało wywołane za pomocą takiego łącza. Stamtąd wyodrębniam instrukcje, których potrzebuję, z adresu URL, aby móc wyświetlić odpowiednie dane.źródło
getData
daje pełny identyfikator URI, możesz również użyć,getDataString
który daje reprezentację tekstową. Tak czy inaczej, możesz skonstruować adres URL tak, aby zawierał wszystkie potrzebne danecom.package.name://my-action/1/2/3/4
, i wyodrębnić informacje z tego ciągu.Uri data = getIntent().getData();
? Ciągle otrzymujęActivity not found to handle intent
błąd. - DziękiInny sposób, pożycza trochę od Linkify, ale pozwala dostosować obsługę.
Klasa niestandardowej rozpiętości:
Funkcja pomocnicza:
Stosowanie:
źródło
jeśli w widoku tekstowym jest wiele łączy. Na przykład textview ma „https: //” i „tel no”, możemy dostosować metodę LinkMovement i obsługiwać kliknięcia słów na podstawie wzorca. W załączeniu jest dostosowana metoda przenoszenia łączy.
Należy to wywołać z widoku tekstu w następujący sposób:
źródło
widget.getContext()
zamiast tego.Oto bardziej ogólne rozwiązanie oparte na odpowiedzi @Arun
Aby z niego skorzystać wystarczy wdrożyć
onLinkClick
wTextViewLinkHandler
klasie. Na przykład:źródło
to bardzo proste, dodaj tę linię do swojego kodu:
źródło
Rozwiązanie
Zaimplementowałem małą klasę, za pomocą której można obsługiwać długie kliknięcia samego TextView i kliknięć w linki w TextView.
Układ
TextViewClickMovement.java
Stosowanie
Spinki do mankietów
Mam nadzieję że to pomoże! Możesz znaleźć kod tutaj .
źródło
Tylko po to, aby udostępnić alternatywne rozwiązanie za pomocą utworzonej przeze mnie biblioteki. Dzięki Textoo można to osiągnąć na przykład:
Lub z dynamicznym źródłem HTML:
źródło
kto szuka tutaj więcej opcji, jest jednym
ZASOBY: CodePath
źródło
źródło
Zmieniłem kolor TextView na niebieski, używając na przykład:
w pliku xml. Jak go podkreślić, wyjaśniono tutaj .
Następnie użyj jego właściwości onClick, aby określić metodę (domyślam się, że możesz zadzwonić
setOnClickListener(this)
w inny sposób), np:Dzięki tej metodzie mogę normalnie robić, co chcę, na przykład uruchomić intencję. Zauważ, że nadal musisz wykonać normalną
myTextView.setMovementMethod(LinkMovementMethod.getInstance());
czynność, na przykład w metodzie onCreate () Twojej aktywności.źródło
Ta odpowiedź rozszerza doskonałe rozwiązanie Jonathana S.
Możesz użyć następującej metody, aby wyodrębnić linki z tekstu:
Można to wykorzystać do usunięcia jednego z parametrów w
clickify()
metodzie:Kilka zmian w ClickSpan:
Teraz możesz po prostu ustawić tekst w TextView, a następnie dodać do niego detektor:
źródło
Najlepszy sposób, w jaki korzystałem i zawsze działał
źródło
Przykład: załóżmy, że ustawiłeś tekst w widoku tekstu i chcesz podać link do określonego wyrażenia tekstowego: „Kliknij #facebook przeniesie Cię na facebook.com”
W układzie XML:
W aktywności:
Utwórz również jednego dostawcę tagów jako:
W pliku manifestu wprowadź dane dla dostawcy i testuj jako:
Teraz po kliknięciu #facebook wywoła testactivtiy. W aktywności testowej możesz uzyskać dane jako:
źródło