Mam TextView, który renderuje podstawowy HTML, zawierający 2+ linki. Muszę przechwytywać kliknięcia linków i otwierać je - w moim własnym wewnętrznym WebView (nie w domyślnej przeglądarce).
Najczęstsza metoda obsługi renderowania linków wygląda następująco:
String str_links = "<a href='http://google.com'>Google</a><br /><a href='http://facebook.com'>Facebook</a>";
text_view.setLinksClickable(true);
text_view.setMovementMethod(LinkMovementMethod.getInstance());
text_view.setText( Html.fromHtml( str_links ) );
Powoduje to jednak, że łącza otwierają się w domyślnej wewnętrznej przeglądarce internetowej (pokazując okno dialogowe „Zakończ działanie za pomocą ...”).
Próbowałem zaimplementować onClickListener, który poprawnie uruchamia się po kliknięciu linku, ale nie wiem, jak ustalić, który link został kliknięty ...
text_view.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// what now...?
}
});
Alternatywnie próbowałem utworzyć niestandardową klasę LinkMovementMethod i zaimplementować onTouchEvent ...
public boolean onTouchEvent(TextView widget, Spannable text, MotionEvent event) {
String url = text.toString();
// this doesn't work because the text is not necessarily a URL, or even a single link...
// eg, I don't know how to extract the clicked link from the greater paragraph of text
return false;
}
Pomysły?
Przykładowe rozwiązanie
Wymyśliłem rozwiązanie, które analizuje linki z ciągu HTML i umożliwia ich klikanie, a następnie pozwala odpowiedzieć na adres URL.
span.getURL()
”.) Możesz nawet opublikować to jako odpowiedź, ponieważ jest to lepsze niż obecnie akceptowana odpowiedź!Odpowiedzi:
Opierając się na innej odpowiedzi , oto funkcja setTextViewHTML (), która analizuje linki z ciągu HTML i czyni je klikalnymi, a następnie pozwala odpowiedzieć na adres URL.
źródło
ListView
s, gdyView
afocusable
jest ustawione na true. Zwykle dzieje się to w przypadkuButton
s /ImageButton
s. Spróbuj zadzwonićsetFocusable(false)
na swójTextView
.text.setMovementMethod(LinkMovementMethod.getInstance());
jeśli nie używasz adresu URLSpanZrobiłeś co następuje:
czy próbowałeś w odwrotnej kolejności, jak pokazano poniżej?
i bez:
źródło
Można to po prostu rozwiązać za pomocą Spannable String. To, co naprawdę chcesz zrobić (wymagania biznesowe), jest dla mnie trochę niejasne, więc poniższy kod nie da dokładnej odpowiedzi na twoją sytuację, ale jestem drobna pewność, że da ci to pewien pomysł i będziesz w stanie rozwiązać swój problem w oparciu o poniższy kod.
Jak to robisz, otrzymuję również dane za pośrednictwem odpowiedzi HTTP i dodałem dodatkowy podkreślony tekst w moim przypadku „więcej”, a ten podkreślony tekst otworzy przeglądarkę internetową po kliknięciu. Mam nadzieję, że to ci pomoże.
źródło
Miałem ten sam problem, ale dużo tekstu pomieszanego z kilkoma linkami i e-mailami. Myślę, że użycie „autoLink” jest prostszym i czystszym sposobem na zrobienie tego:
Możesz ustawić Linkify.EMAIL_ADDRESSES lub Linkify.WEB_URLS, jeśli jest tylko jeden z nich, którego chcesz użyć lub ustawić w układzie XML
Dostępne opcje to: brak, internet, e-mail, telefon, mapa, wszystko
ź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 helops! Możesz znaleźć kod tutaj .
źródło
text_view.setMovementMethod(new TextViewClickMovement(this, context));
; Android Studio skarży się, żecontext
nie można go rozwiązać.O wiele czystsze i lepsze rozwiązanie, wykorzystujące natywną bibliotekę Linkify .
Przykład:
źródło
Stworzyłem łatwą funkcję rozszerzenia w Kotlin, aby przechwytywać kliknięcia linków url w TextView, stosując nowe wywołanie zwrotne do elementów URLSpan.
strings.xml (przykładowy link w tekście)
Upewnij się, że Twój łączony tekst jest ustawiony na TextView przed wywołaniem „handleUrlClicks”
To jest funkcja rozszerzenia:
Tak to nazywam:
źródło
Jeśli używasz Kotlina, napisałem proste rozszerzenie dla tego przypadku:
Stosowanie:
źródło
Alternatywne, o wiele prostsze podejście (dla leniwych programistów takich jak ja;)
W razie potrzeby możesz również sprawdzić schemat / typ MIME intencji
źródło
Używam tylko textView i ustawiam zakres dla kliknięcia adresu URL i uchwytu.
Znalazłem tutaj bardzo eleganckie rozwiązanie, bez linków - zgodnie z tym wiem, którą część łańcucha chcę dodać do linkify
obsłużyć kliknięcie linku Textview w mojej aplikacji na Androida
w kotlinie:
i użycie: linkify (yourTextView, urlString, context)
źródło