Saya memiliki TextView yang merender HTML biasa, yang berisi 2+ tautan. Saya perlu menangkap klik pada tautan dan membuka tautan - di WebView internal saya sendiri (bukan di browser default.)
Metode paling umum untuk menangani perenderan tautan tampaknya seperti ini:
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 ) );
Namun, ini menyebabkan tautan terbuka di browser web internal default (menampilkan dialog "Selesaikan Tindakan Menggunakan ...").
Saya mencoba menerapkan onClickListener, yang dipicu dengan benar saat tautan diklik, tetapi saya tidak tahu cara menentukan tautan mana yang diklik ...
text_view.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// what now...?
}
});
Atau, saya mencoba membuat kelas LinkMovementMethod khusus dan menerapkan 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;
}
Ide ide?
Contoh solusi
Saya datang dengan solusi yang mem-parsing tautan dari string HTML dan membuatnya dapat diklik, dan kemudian memungkinkan Anda merespons URL.
span.getURL()
".) Anda bahkan dapat mempostingnya sebagai jawaban, karena itu lebih baik daripada jawaban yang diterima saat ini!Jawaban:
Berdasarkan jawaban lain , berikut adalah fungsi setTextViewHTML () yang mem-parsing tautan dari string HTML dan membuatnya dapat diklik, lalu memungkinkan Anda merespons URL.
sumber
ListView
s ketikaView
'sfocusable
diatur benar. Ini biasanya terjadi denganButton
s /ImageButton
s. Coba hubungisetFocusable(false)
AndaTextView
.text.setMovementMethod(LinkMovementMethod.getInstance());
jika tidak menggunakan URLSpanAnda telah melakukan sebagai berikut:
Sudahkah Anda mencoba dalam urutan terbalik seperti yang ditunjukkan di bawah ini?
dan tanpa:
sumber
Ini dapat diselesaikan dengan mudah dengan menggunakan Spannable String. Apa yang benar-benar ingin Anda lakukan (Persyaratan Bisnis) sedikit tidak jelas bagi saya sehingga kode berikut tidak akan memberikan jawaban yang tepat untuk situasi Anda, tetapi saya yakin kecil itu akan memberi Anda beberapa ide dan Anda akan dapat menyelesaikan masalah Anda berdasarkan kode berikut.
Saat Anda melakukannya, saya juga mendapatkan beberapa data melalui respons HTTP dan saya telah menambahkan beberapa teks bergaris bawah tambahan dalam kasus saya "lebih" dan teks yang digarisbawahi ini akan membuka browser web saat acara diklik. Semoga ini bisa membantu Anda.
sumber
Saya memiliki masalah yang sama tetapi banyak teks bercampur dengan beberapa tautan dan email. Menurut saya menggunakan 'tautan otomatis' adalah cara yang lebih mudah dan lebih bersih untuk melakukannya:
Anda dapat menyetel Linkify.EMAIL_ADDRESSES atau Linkify.WEB_URLS jika hanya ada satu yang ingin Anda gunakan atau setel dari tata letak XML
Opsi yang tersedia adalah: tidak ada, web, email, telepon, peta, semua
sumber
Larutan
Saya telah menerapkan kelas kecil dengan bantuan yang Anda dapat menangani klik panjang pada TextView itu sendiri dan Taps pada tautan di TextView.
Tata Letak
TextViewClickMovement.java
Pemakaian
Tautan
Semoga helops ini! Anda dapat menemukan kode di sini .
sumber
text_view.setMovementMethod(new TextViewClickMovement(this, context));
; Android Studio mengeluh karenacontext
tidak dapat diselesaikan.Solusi yang lebih bersih dan lebih baik, menggunakan pustaka Linkify asli .
Contoh:
sumber
Saya membuat fungsi ekstensi yang mudah di Kotlin untuk menangkap klik tautan url di TextView dengan menerapkan callback baru ke elemen URLSpan.
strings.xml (contoh tautan dalam teks)
Pastikan teks span Anda disetel ke TextView sebelum Anda memanggil "handleUrlClicks"
Ini adalah fungsi ekstensi:
Beginilah saya menyebutnya:
sumber
Jika Anda menggunakan Kotlin, saya menulis ekstensi sederhana untuk kasus ini:
Pemakaian:
sumber
Alternatif, cara pendekatan yang lebih sederhana (untuk pengembang yang malas seperti saya;)
Jika perlu, Anda juga bisa memeriksa skema / mimetype maksud
sumber
Saya hanya menggunakan textView, dan mengatur rentang untuk url dan menangani klik.
Saya menemukan solusi yang sangat elegan di sini, tanpa tautan - menurut itu saya tahu bagian mana dari string yang ingin saya tautkan
menangani klik tautan textview di aplikasi android saya
di kotlin:
dan penggunaan: linkify (yourTextView, urlString, konteks)
sumber