Saya telah menambahkan gambar kanan teks dalam EditText
widget, menggunakan XML berikut:
<EditText
android:id="@+id/txtsearch"
...
android:layout_gravity="center_vertical"
android:background="@layout/shape"
android:hint="Enter place,city,state"
android:drawableRight="@drawable/cross" />
Tapi saya ingin menghapus EditText
ketika gambar tertanam diklik. Bagaimana saya bisa melakukan ini?
Jawaban:
Sebenarnya Anda tidak perlu memperpanjang kelas apa pun. Katakanlah saya memiliki EditText editComment dengan drawableRight
kami
getRawX()
karena kami ingin mendapatkan posisi sentuhan aktual di layar, bukan relatif terhadap orang tua.Untuk mendapatkan klik sisi kiri
sumber
event.getRawX()
alih-alihevent.getX()
@AngeloSgetRight()
mendapatkan hak TextView, yang tidak akan menjadi hak drawable jika ada padding. Menambahkan- editComment.getPaddingRight()
ke akhirif
pernyataan Anda akan berhasil.Sangat, sangat bagus, terima kasih kepada semua orang yang berkontribusi dalam diskusi ini. Jadi, jika Anda tidak ingin berurusan dengan ketidaknyamanan dalam memperpanjang kelas, Anda dapat melakukan hal berikut (hanya diterapkan untuk menggambar yang tepat)
Dan inilah implementasi pendengar telanjang berdasarkan jawaban @ Mark
sumber
v.getRight()
denganv.getWidth()
.fuzz
secara efektif membuat area yang disentuh sedikit lebih besar, membuatnya lebih mudah untuk mengetuk drawable kecil.Pertimbangkan yang berikut ini. Ini bukan solusi yang paling elegan tetapi berhasil, saya hanya mengujinya.
Buat
EditText
kelas yang disesuaikanCustomEditText.java
:Ubah tata letak XML Anda ke ini (di mana
com.example
nama paket proyek Anda yang sebenarnya):Terakhir, tambahkan ini (atau yang serupa) ke aktivitas Anda:
Saya mungkin sedikit kecewa dengan perhitungan batas sentuh untuk drawable yang bersarang tetapi Anda mendapatkan idenya.
Saya harap ini membantu.
sumber
TextView
bukanEditText
. Saya mengambil kode dan jika saya klik padaTextView
(bukan ikon tetapi pada spasi diTextView
), metodeonTouchEvent(MotionEvent event)
ini dipanggil. Jadi, saya bisa menerapkanOnClickListener
untuk yang biasaTextView
tanpa kelas tambahan sepertiCustomEditText
this.getRight()-rBounds.width()
mengapa tidak menggunakanthis.getMeasuredWidth() - this.getCompoundPaddingRight()
? Bukankah itu akan merawat lapisan drawable dan juga menyingkirkan ikatan drawable?EditText
tidak mendukung pewarnaan widget yang tepat saat menggunakan appcompat pada perangkat pra-lolipop. GunakanAppCompatEditText
sebagai kelas induk EditText kustom AndaSaya membuat sebuah kelas abstrak yang berguna DrawableClickListener yang mengimplementasikan OnTouchListener .
Selain kelas DrawableClickListener , saya juga membuat 4 kelas abstrak tambahan yang memperluas kelas DrawableClickListener dan menangani mengklik area gambar untuk kuadran yang benar.
Poin untuk Dipertimbangkan
Satu hal yang perlu dipertimbangkan adalah bahwa gambar tidak diubah ukurannya jika dilakukan dengan cara ini; dengan demikian gambar harus diskalakan dengan benar sebelum dimasukkan ke dalam folder res / drawable .
Jika Anda menetapkan LinearLayout yang berisi ImageView dan TextView , akan jauh lebih mudah untuk memanipulasi ukuran gambar yang sedang ditampilkan.
activity_my.xml
MyActivity.java
DrawableClickListener.java
sumber
Sangat sederhana. Katakanlah Anda memiliki gambar di sebelah kiri EditText 'txtsearch' Anda. Mengikuti akan melakukan trik.
Jika Anda ingin menggambar yang benar, ubah pernyataan if ke:
Demikian pula, Anda dapat melakukannya untuk semua drawable majemuk.
Pemanggilan metode ini mengembalikan semua padding di sisi itu termasuk semua drawable. Anda dapat menggunakan ini bahkan untuk TextView, Tombol dll.
Klik di sini untuk referensi dari situs pengembang android.
sumber
Saya pikir itu jauh lebih mudah jika kita menggunakan beberapa trik :)
Selesai
sumber
RelativeLayout
untuk mencapai posisi yang tepat, sepertinya tidak terlalu berbelit-belit daripada solusi lain, dan jauh lebih sedikit kode yang harus dipelihara.Penggunaan kontribusi terakhir itu
contains(x,y)
tidak akan bekerja secara langsung pada hasilgetBounds()
(kecuali, secara kebetulan, ketika menggunakan drawables "kiri"). ThegetBounds
Metode hanya menyediakanRect
poin mendefinisikan item ditarik dinormalisasi dengan asal di 0,0 - jadi, Anda benar-benar perlu melakukan matematika dari posting asli untuk mengetahui apakah klik adalah di daerah ditarik dalam konteks mengandung dimensi EditText, tetapi ubahlah untuk atas, kanan, kiri dll. Atau Anda dapat menggambarkanRect
bahwa yang memiliki koordinat sebenarnya relatif terhadap posisinya dalamEditText
wadah dan digunakancontains()
, meskipun pada akhirnya Anda melakukan matematika yang sama.Menggabungkan keduanya memberi Anda solusi yang cukup lengkap, saya hanya menambahkan atribut instance
consumesEvent
yang memungkinkan pengguna API memutuskan apakah acara klik harus diteruskan atau tidak dengan menggunakan hasilnya untuk ditetapkanACTION_CANCEL
atau tidak.Juga, saya tidak bisa melihat mengapa nilai
bounds
danactionX
,actionY
adalah atribut instance daripada hanya lokal pada stack.Berikut adalah potongan dari implementasi berdasarkan hal di atas yang saya kumpulkan. Ini memperbaiki masalah yang mengkonsumsi acara dengan benar Anda harus kembali palsu. Itu menambahkan faktor "fuzz" ke. Dalam kasus penggunaan saya ikon Kontrol Suara di
EditText
bidang, saya merasa sulit untuk mengklik, sehingga fuzz meningkatkan batas efektif yang dianggap mengklik drawable. Bagi saya15
bekerja dengan baik. Saya hanya perludrawableRight
jadi saya tidak menghubungkan matematika yang lain, untuk menghemat ruang, tetapi Anda melihat idenya.sumber
Memperluas gagasan oleh RyanM Saya telah membuat versi yang lebih fleksibel, yang mendukung semua tipe yang dapat digambar (atas, bawah, kiri, kanan). Sementara kode di bawah ini memperluas TextView, mengadaptasinya untuk EditText hanyalah kasus swapping "extends TextView" dengan "extends EditText". Instantiasi widget dari XML identik seperti pada contoh RyanM, batalkan nama widget.
DrawableClickListener sesederhana ini:
Dan kemudian implementasi yang sebenarnya:
ps: Jika Anda tidak mengatur pendengar, menyentuh TextView akan menyebabkan NullPointerException. Anda mungkin ingin menambahkan lebih banyak paranoia ke dalam kode.
sumber
Kotlin adalah bahasa yang hebat di mana setiap kelas dapat diperluas dengan metode baru. Mari kita kenalkan metode baru untuk kelas EditText yang akan menangkap klik agar dapat digambar dengan benar.
Anda bisa melihatnya dibutuhkan fungsi callback sebagai argumen yang dipanggil saat pengguna mengklik ke drawable kanan.
sumber
ini bekerja untuk saya,
sumber
Saya tahu ini cukup lama, tetapi saya baru-baru ini harus melakukan sesuatu yang serupa ... Setelah melihat betapa sulitnya ini, saya datang dengan solusi yang lebih sederhana:
Dalam kasus saya, saya membutuhkan EditText yang memiliki kemampuan untuk menghapus teks dengan tombol. Saya ingin terlihat seperti SearchView, tetapi karena sejumlah alasan saya tidak ingin menggunakan kelas itu. Contoh di bawah ini menunjukkan bagaimana saya menyelesaikan ini. Meskipun tidak ada hubungannya dengan perubahan fokus, prinsip-prinsipnya sama dan saya pikir akan lebih bermanfaat untuk mengirim kode kerja yang sebenarnya daripada mengumpulkan contoh yang mungkin tidak bekerja persis seperti yang saya maksudkan:
Inilah tata letak saya: clearable_edit_text.xml
Dan di sini adalah Kelas yang mengembang tata letak itu: ClearableEditText.java
Untuk membuat jawaban ini lebih sesuai dengan pertanyaan, langkah-langkah berikut harus diambil:
sumber
dan jika drawable ada di sebelah kiri, ini akan membantu Anda. (bagi mereka yang bekerja dengan tata letak RTL)
sumber
Cukup salin tempel kode berikut dan lakukan triknya.
sumber
Tidak ada solusi sebelumnya yang bekerja untuk saya di Xamarin Android . Saya bisa membuat pendengar klik kanan yang dapat bekerja menggunakan yang berikut ini:
Buat
OnEditTextTouch
pendengar acara berikut :Berlangganan acara Touch:
sumber
Ini semua hebat tetapi mengapa tidak membuatnya sangat sederhana?
Saya telah berhadapan dengan itu juga belum lama ini ... dan android touchlistiner berfungsi dengan baik tetapi memberikan batasan dalam penggunaan..dan saya datang ke solusi lain dan saya harap itu akan membantu Anda:
Sekarang Anda dapat membuat pendengar atau acara ImageClick dan melakukan apa pun yang Anda inginkan dengan teks. File edittext_round_corners.xml ini
sumber
EditText
seharusnyaandroid:background="@android:color/transparent"
.Lebih baik memiliki ImageButton di sebelah kanan teks edit dan memberikan margin tata letak negatif untuk tumpang tindih dengan teks edit. Atur pendengar di ImageButton dan lakukan operasi.
sumber
sumber
sumber
untuk pendengar klik yang dapat ditarik kiri
sumber
Drawable majemuk tidak seharusnya dapat diklik. Lebih bersih untuk menggunakan tampilan terpisah dalam LinearLayout horizontal dan menggunakan penangan klik pada mereka.
sumber
Bagi siapa pun yang tidak ingin menerapkan penanganan klik mengerikan. Anda dapat mencapai hal yang sama dengan a
RelativeLayout
. Dengan itu Anda bahkan memiliki penanganan gratis terhadap posisi yang dapat digambar.The
ImageView
posisi akan sama seperti yang akan Anda gunakandrawableEnd
- ditambah Anda tidak perlu semua penanganan sentuhan pendengar. Hanya pendengar klik untukImageView
dan Anda siap melakukannya.sumber
Ini bekerja untuk saya :) semoga ini membantu Anda juga
sumber
Saya telah melihat beberapa solusi tetapi saya tidak yakin dengan salah satu dari mereka. Baik sangat rumit atau terlalu sederhana (tidak dapat digunakan kembali).
Ini adalah pendekatan favorit saya saat ini:
Dan ini adalah pendengar sentuh yang dapat digunakan kembali:
Anda dapat melihat Intinya di sini.
sumber
Ikuti kode di bawah ini untuk klik kanan, kiri, atas, bawah yang dapat digambar:
}
sumber
Saya sudah menerapkannya di Kotlin
sumber
Berikut solusi sederhana saya, hanya menempatkan
ImageButton
lebihEditText
:sumber
Saya ingin menyarankan cara untuk menggambar kiri! Saya mencoba kode ini dan berhasil.
sumber
Saya menerapkan jawaban @aristo_sh di Mono.Droid (Xamarin), karena ini adalah metode anonim delegasi yang tidak dapat Anda kembalikan benar atau salah, Anda harus mengambil dari e.Event.Handled. Saya juga menyembunyikan keyboard saat klik
sumber
Membagikan solusi umum saya untuk menangani acara klik dan sentuh TextView compound yang dapat ditarik.
Pertama, kita membutuhkan pengendali acara sentuh:
Sekarang Anda dapat memproses acara sentuh apa pun pada senyawa apa pun yang dapat digambar dari TextView mana pun yang Anda suka:
Hanya tertarik dengan klik? Cukup saring dengan tindakan MotionEvent:
Sekali lagi kami dapat dengan mudah menangani klik pada senyawa apa pun yang dapat digambar dari TextView apa pun:
Semoga Anda menyukainya seperti saya. Saya akan mencoba untuk memperbaruinya di sini dan di intinya terkait jika ada perubahan.
sumber
Saya telah membuat kelas pendengar sentuh kustom sederhana alih-alih EditText kustom
}
Tidak akan ada gambar ketika EditText kosong. Drawable akan muncul ketika kami mulai mengedit untuk menghapus EditText.
Anda bisa mengatur pendengar sentuh
mEditText.setOnTouchListener (MyTouchListener baru (mEditText));
sumber