Saat ini saya sedang merender input HTML dalam TextView seperti:
tv.setText(Html.fromHtml("<a href='test'>test</a>"));
HTML yang ditampilkan disediakan kepada saya melalui sumber daya eksternal, jadi saya tidak dapat mengubah hal-hal di sekitar seperti yang saya mau, tapi saya tentu saja dapat melakukan beberapa perubahan regex dengan HTML, untuk mengubah nilai href, mengatakan, ke sesuatu yang lain.
Yang saya inginkan adalah dapat menangani klik tautan langsung dari dalam aplikasi, daripada membiarkan tautan membuka jendela browser. Apakah ini dapat dicapai? Saya menduga akan mungkin untuk mengatur protokol nilai href ke sesuatu seperti "myApp: //", dan kemudian mendaftarkan sesuatu yang memungkinkan aplikasi saya menangani protokol itu. Jika ini memang cara terbaik, saya ingin tahu bagaimana hal itu dilakukan, tetapi saya berharap ada cara yang lebih mudah untuk hanya mengatakan, "ketika sebuah tautan diklik dalam tampilan teks ini, saya ingin mengangkat acara yang menerima nilai href dari tautan sebagai parameter input "
Jawaban:
Datang pada ini hampir setahun kemudian, ada cara berbeda di mana saya memecahkan masalah khusus saya. Karena saya ingin tautan ditangani oleh aplikasi saya sendiri, ada solusi yang sedikit lebih sederhana.
Selain filter maksud default, saya cukup membiarkan aktivitas target saya mendengarkan
ACTION_VIEW
maksud, dan khususnya, mereka yang memiliki skemacom.package.name
Ini berarti bahwa tautan yang dimulai dengan
com.package.name://
akan ditangani oleh aktivitas saya.Jadi yang harus saya lakukan adalah membuat URL yang berisi informasi yang ingin saya sampaikan:
Dalam aktivitas target saya, saya dapat mengambil alamat ini:
Dalam contoh saya, saya cukup memeriksa
data
nilai-nilai nol, karena kapan pun itu bukan nol, saya akan tahu itu dipanggil melalui tautan semacam itu. Dari sana, saya mengekstrak instruksi yang saya butuhkan dari url untuk dapat menampilkan data yang sesuai.sumber
getData
memberi Anda URI lengkap, Anda juga bisa menggunakangetDataString
yang menghasilkan representasi teks. Apa pun itu, Anda bisa membuat URL sehingga memuat semua data yang Anda butuhkancom.package.name://my-action/1/2/3/4
, dan Anda bisa mengekstrak informasi dari string itu.Uri data = getIntent().getData();
? Saya terus menerimaActivity not found to handle intent
kesalahan. - Terima kasihCara lain, meminjam sedikit dari Linkify tetapi memungkinkan Anda untuk menyesuaikan penanganan Anda.
Kelas Rentang Kustom:
Fungsi pembantu:
Pemakaian:
sumber
jika ada beberapa tautan dalam tampilan teks. Misalnya tampilan teks memiliki "https: //" dan "no tel" kami dapat menyesuaikan metode LinkMovement dan menangani klik untuk kata-kata berdasarkan suatu pola. Terlampir adalah Metode Gerakan Tautan yang dikustomisasi.
Ini harus dipanggil dari tampilan teks dengan cara berikut:
sumber
widget.getContext()
saja.Ini adalah solusi yang lebih umum berdasarkan jawaban @Arun
Untuk menggunakannya hanya menerapkan
onLinkClick
dariTextViewLinkHandler
kelas. Misalnya:sumber
sangat sederhana, tambahkan baris ini ke kode Anda:
sumber
Larutan
Saya telah menerapkan kelas kecil dengan bantuan yang Anda dapat menangani klik panjang pada TextView sendiri dan Taps pada tautan di TextView.
Tata letak
TextViewClickMovement.java
Pemakaian
Tautan
Semoga ini membantu! Anda dapat menemukan kode di sini .
sumber
Hanya untuk berbagi solusi alternatif menggunakan perpustakaan yang saya buat. Dengan Textoo , ini bisa dicapai seperti:
Atau dengan sumber HTML dinamis:
sumber
untuk yang mencari lebih banyak opsi di sini adalah satu
SUMBER DAYA: CodePath
sumber
sumber
Saya mengubah warna TextView menjadi biru dengan menggunakan misalnya:
dalam file xml. Cara membuatnya digarisbawahi dijelaskan di sini .
Kemudian gunakan properti onClick untuk menentukan metode (saya kira Anda bisa memanggil
setOnClickListener(this)
sebagai cara lain), misalnya:Dalam metode itu, saya bisa melakukan apa pun yang saya inginkan seperti biasa, seperti meluncurkan niat. Perhatikan bahwa Anda masih harus melakukan
myTextView.setMovementMethod(LinkMovementMethod.getInstance());
hal yang normal , seperti pada metode onCreate () aktivitas Anda.sumber
Jawaban ini memperluas solusi terbaik Jonathan S:
Anda dapat menggunakan metode berikut untuk mengekstrak tautan dari teks:
Ini dapat digunakan untuk menghapus salah satu parameter dalam
clickify()
metode:Beberapa perubahan pada ClickSpan:
Sekarang Anda cukup mengatur teks pada TextView dan kemudian menambahkan pendengar ke dalamnya:
sumber
Cara terbaik yang saya gunakan dan selalu berhasil untuk saya
sumber
Contoh: Misalkan Anda telah menetapkan beberapa teks dalam tampilan teks dan Anda ingin memberikan tautan pada ekspresi teks tertentu: "Klik pada #facebook akan membawa Anda ke facebook.com"
Dalam tata letak xml:
Dalam Aktivitas:
Juga buat satu penyedia tag sebagai:
Dalam file manifes jadikan sebagai entri untuk penyedia dan aktivitas pengujian sebagai:
Sekarang ketika Anda mengklik #facebook, itu akan memanggil testactivtiy. Dan dalam aktivitas tes Anda bisa mendapatkan data sebagai:
sumber