Saya memiliki aktivitas yang sangat panjang dengan scrollview. Ini adalah formulir dengan berbagai bidang yang harus diisi oleh pengguna. Saya memiliki kotak centang setengah jalan ke formulir saya, dan ketika pengguna memeriksanya saya ingin menggulir ke bagian tertentu dari tampilan. Apakah ada cara untuk menggulir ke objek EditText (atau objek tampilan lainnya) secara terprogram?
Juga, saya tahu ini mungkin menggunakan koordinat X dan Y tetapi saya ingin menghindari melakukan ini karena formulir dapat berubah dari pengguna ke pengguna.
android
view
android-edittext
scrollview
programmatically-created
NotACleverMan
sumber
sumber
the form may changed from user to user
tetapi Anda bisa menggunakanmEditView.getTop();
Jawaban:
sumber
your_scrollview.post(...
Jawaban Sherif elKhatib dapat sangat ditingkatkan, jika Anda ingin menggulir tampilan ke tengah tampilan gulir . Metode yang dapat digunakan kembali ini menggulung tampilan ke pusat HorizontalScrollView yang terlihat.
Untuk
ScrollView
penggunaan vertikalsumber
Ini bekerja dengan baik untuk saya:
child - Anak dari ViewParent ini yang ingin fokus. Tampilan ini akan berisi tampilan fokus. Belum tentu pandangan yang benar-benar memiliki fokus.
terfokus - Pandangan yang merupakan keturunan anak yang sebenarnya memiliki fokus
sumber
Menurut pendapat saya cara terbaik untuk menggulir ke persegi panjang yang diberikan adalah melalui
View.requestRectangleOnScreen(Rect, Boolean)
. Anda harus menyebutnya di tempatView
yang ingin Anda gulir dan melewati kotak lokal yang Anda ingin terlihat di layar. Parameter kedua harusfalse
untuk pengguliran halus dantrue
untuk pengguliran segera.sumber
scrollview.smoothScrollTo
tidak akan berfungsi jika tampilan yang diminta tidak aktif, (dicoba di emulator android dengan versi SD 26)new Handler().post()
?Saya membuat metode utilitas kecil berdasarkan Answer dari WarrenFaith, kode ini juga memperhitungkan jika tampilan itu sudah terlihat di scrollview, tidak perlu untuk scroll.
sumber
scrollBounds
harus menjadi parameter untukscrollView.getHitRect
metode ini.Anda harus membuat
TextView
fokus permintaan Anda :sumber
EditText saya bersarang beberapa lapisan di dalam ScrollView saya, yang itu sendiri bukan tampilan root tata letak. Karena getTop () dan getBottom () tampaknya melaporkan koordinat di dalamnya yang berisi tampilan, saya sudah menghitung jarak dari bagian atas ScrollView ke bagian atas EditText dengan beralih melalui orang tua dari EditText.
sumber
Varition lain adalah:
atau Anda dapat menggunakan
post()
metode ini.sumber
Saya tahu ini mungkin sudah terlambat untuk jawaban yang lebih baik tetapi solusi sempurna yang diinginkan harus berupa sistem seperti positioner. Maksudku, ketika sistem membuat posisi untuk bidang Editor itu menempatkan bidang hanya ke keyboard, sehingga UI / UX aturan itu sempurna.
Apa yang membuat kode di bawah ini adalah cara penempatan Android dengan lancar. Pertama-tama kita menjaga titik gulir saat ini sebagai titik referensi. Hal kedua adalah menemukan titik gulir penentuan posisi terbaik untuk seorang editor, untuk melakukan ini kita gulir ke atas, dan kemudian meminta bidang editor untuk membuat komponen ScrollView untuk melakukan penentuan posisi terbaik. Gatcha! Kami telah mempelajari posisi terbaik. Sekarang, apa yang akan kita lakukan adalah menggulir dengan lancar dari titik sebelumnya ke titik yang baru kita temukan. Jika mau, Anda dapat menghilangkan pengguliran yang lancar dengan menggunakan scrollTo alih-alih smoothScrollTo saja.
CATATAN: Wadah utama ScrollView adalah bidang anggota bernama scrollViewSignup, karena contoh saya adalah layar pendaftaran, karena Anda mungkin sering tahu.
Jika Anda ingin menggunakan blok ini untuk semua instance EditText , dan cepat mengintegrasikannya dengan kode layar Anda. Anda cukup membuat traverser seperti di bawah ini. Untuk melakukan ini, saya telah membuat OnFocusChangeListener utama bidang anggota bernama focusChangeListenerToScrollEditor , dan menyebutnya selama onCreate seperti di bawah ini.
Dan implementasinya adalah sebagai berikut.
Jadi, apa yang kami lakukan di sini adalah menjadikan semua anak contoh EditText untuk memanggil pendengar sebagai fokus.
Untuk mencapai solusi ini, saya telah memeriksanya semua solusi di sini, dan menghasilkan solusi baru untuk hasil UI / UX yang lebih baik.
sumber
Jawaban di atas akan berfungsi dengan baik jika ScrollView adalah induk langsung dari ChildView. Jika ChildView Anda sedang dibungkus dalam ViewGroup lain di ScrollView, itu akan menyebabkan perilaku yang tidak terduga karena View.getTop () mendapatkan posisi relatif terhadap induknya. Dalam hal demikian, Anda perlu menerapkan ini:
sumber
referensi: https://stackoverflow.com/a/6438240/2624806
Mengikuti bekerja jauh lebih baik.
sumber
Saya pikir saya telah menemukan solusi yang lebih elegan dan lebih sedikit kesalahan menggunakan
Tidak ada matematika yang terlibat, dan bertentangan dengan solusi yang diusulkan lainnya, itu akan menangani dengan benar menggulir ke atas dan ke bawah.
Adalah ide yang baik untuk membungkusnya
postDelayed
agar lebih andal, jikaScrollView
sedang diubah saat inisumber
Meneliti kode sumber Android, Anda dapat menemukan bahwa sudah ada fungsi anggota
ScrollView
-scrollToChild(View)
- yang melakukan persis apa yang diminta. Sayangnya, fungsi ini karena beberapa alasan tidak jelas ditandaiprivate
. Berdasarkan fungsi itu saya telah menulis fungsi berikut ini yang menemukan yang pertama diScrollView
atasView
ditentukan sebagai parameter dan menggulirnya sehingga menjadi terlihat di dalamScrollView
:sumber
Solusi saya adalah:
sumber
Menjawab dari proyek praktis saya.
sumber
Dalam kasus saya, itu bukan
EditText
, itugoogleMap
. Dan itu berhasil seperti ini.sumber
Que: Apakah ada cara untuk menggulir tampilan gulir secara terprogram ke edittext tertentu?
Jawab: Tampilan gulir bersarang di posisi terakhir recyclerview menambahkan data rekaman.
Apakah ada cara untuk menggulir tampilan gulir secara terprogram ke teks edit tertentu?
sumber
Berikut ini adalah apa yang saya gunakan:
Ini mendapatkan jumlah gulir yang diperlukan untuk menunjukkan bagian bawah tampilan, termasuk margin di bagian bawah tampilan itu.
sumber
Gulir vertikal, bagus untuk formulir. Jawaban didasarkan pada gulir horizontal Ahmadalibaloch.
sumber
HorizontalScrollView
metode ini?Anda bisa menggunakan
ObjectAnimator
seperti ini:sumber
Berdasarkan jawaban Sherif, berikut ini paling sesuai untuk kasus penggunaan saya. Perubahan penting
getTop()
bukannyagetBottom()
dansmoothScrollTo()
bukanscrollTo()
.sumber
Jika scrlMain adalah NestedScrollView Anda, gunakan yang berikut ini,
sumber