Saya memiliki ViewPager dan di bawahnya saya memiliki 10 tombol. Dengan mengklik tombol, misalnya # 4, halaman segera menuju ke halaman # 4 mPager.setCurrentItem(3);
. Tapi, saya ingin menonaktifkan paging dengan menggesekkan jari secara horizontal. Dengan demikian, paging dilakukan HANYA dengan mengklik tombol. Jadi, bagaimana saya bisa menonaktifkan gesek dengan jari?
android
android-viewpager
theateist
sumber
sumber
Jawaban:
Anda perlu subkelas
ViewPager
.onTouchEvent
memiliki banyak hal baik di dalamnya yang tidak ingin Anda ubah seperti membiarkan pandangan anak untuk disentuh.onInterceptTouchEvent
adalah apa yang ingin Anda ubah. Jika Anda melihat kode untukViewPager
, Anda akan melihat komentar:Inilah solusi lengkapnya:
Pertama, tambahkan kelas ini ke
src
folder Anda :Selanjutnya, pastikan untuk menggunakan kelas ini daripada yang biasa
ViewPager
, yang mungkin Anda tentukan sebagaiandroid.support.v4.view.ViewPager
. Di file tata letak Anda, Anda ingin menentukannya dengan sesuatu seperti:Contoh khusus ini dalam a
LinearLayout
dan dimaksudkan untuk mengambil seluruh layar, itulah sebabnyalayout_weight
1 danlayout_height
0dp.Dan
setMyScroller();
metode untuk transisi yang mulussumber
0dp
tinggi /1
berat daripadamatch_parent
tinggi untuk mencapai efek layar penuh? Apakah Anda memperoleh peningkatan kinerja dengan melakukannya?executeKeyEvent()
. Ini adalah metode yang kemudian memanggilallowScroll()
.// Never allow swiping by keyboard LEFT, RIGHT, TAB and SHIFT+TAB keys
@Override public boolean executeKeyEvent(KeyEvent event) { return false; }
Ekstensi yang lebih umum
ViewPager
adalah membuatSetPagingEnabled
metode sehingga kita dapat mengaktifkan dan menonaktifkan paging dengan cepat. Untuk mengaktifkan / menonaktifkan gesekan, cukup taruh dua metode:onTouchEvent
danonInterceptTouchEvent
. Keduanya akan mengembalikan "false" jika paging dinonaktifkan.Kemudian pilih ini sebagai ganti viewpager built-in dalam XML
Anda hanya perlu memanggil
setPagingEnabled
metode denganfalse
dan pengguna tidak akan dapat menggesek paginasi.sumber
onTouchEvent
danonInterceptTouchEvent
metode Anda denganreturn enabled && super.onTouchEvent(event);
Cara termudah adalah dengan
setOnTouchListener
dan kembalitrue
untukViewPager
.sumber
pager.setCurrentItem(pager.getCurrentItem());
sebelum kembalitrue
.public int getItemPosition(Object object) { return POSITION_NONE; }
di adaptor saya, yang memaksa rekreasi halaman dan mungkin memecahkan masalah lain juga.Lebih baik mendeklarasikannya dengan gaya, sehingga Anda dapat mengubah propertinya dari xml:
Dan dalam nilai Anda / attr.xml:
sehingga Anda dapat menggunakannya di tata letak Anda xml:
Tentu saja, Anda masih dapat memiliki properti get / set.
sumber
Hanya mengesampingkan
onTouchEvent
danonInterceptTouchEvent
tidak mencukupi jika Anda memiliki ViewPager sendiri di dalam ViewPager lain. Child ViewPager akan mencuri peristiwa sentuh gulir horizontal dari ViewPager induk kecuali jika diposisikan pada halaman pertama / terakhir.Untuk membuat pengaturan ini berfungsi dengan baik, Anda perlu mengganti juga
canScrollHorizontally
metode ini.Lihat
LockableViewPager
implementasi di bawah ini.sumber
Sekarang kita tidak perlu membuat custom
ViewPager
ViewPager2
Nama baru Lihat tersedia di androidViewPager2
mendukung paging vertikal selain paging horizontal tradisional. Anda dapat mengaktifkan paging vertikal untuk suatuViewPager2
elemen dengan mengaturandroid:orientation
atributnyaUntuk menonaktifkan menggesek
viewpager2
digunakanUntuk mengaktifkan gesek yang
viewpager2
Digunakanuntuk informasi lebih lanjut, periksa ini
MEMPERBARUI
Silakan periksa: Migrasikan dari ViewPager ke ViewPager2
Untuk contoh lengkap, periksa Penggunaan ViewPager2 ini di Android
sumber
viewpager2
denganRecyclerView.Adapter
Jika Anda memperpanjang dari ViewPager, Anda juga harus mengganti
executeKeyEvent
seperti yang ditunjukkan sebelumnya oleh @araksKarena beberapa perangkat seperti Galaxy Tab 4 10 'menunjukkan tombol-tombol ini di mana sebagian besar perangkat tidak pernah menunjukkannya:
sumber
Untuk menonaktifkan geser
Untuk mengaktifkan gesek
sumber
Saya perlu menonaktifkan menggesek pada satu halaman tertentu, dan memberikan animasi karet-band yang bagus, begini caranya:
sumber
onPageSelected
akan dieksekusi. Bahkan halaman selanjutnya akan berganti. Jadi, kode ini tidak diperlukan.Saya tahu ini sangat terlambat untuk memposting ini, tetapi ini adalah hack kecil untuk mencapai hasil Anda;)
Cukup tambahkan tampilan dummy di bawah viewpager Anda:
Kemudian tambahkan
OnClickListener
keRelativeLayout
.Dapatkan sedikit kreatif dengan tata letak, penempatan mereka dan perilaku mereka dan Anda akan belajar untuk menemukan cara untuk melakukan apa pun yang Anda bayangkan :)
Semoga berhasil!
sumber
setClickable
alih-alihsetOnClickListener
, jika Anda tidak perlu menanganionClick
acara.Saya menulis
CustomViewPager
dengan kontrol swiping:Jika Anda mengatur
canScroll
ketrue
, iniViewPager
bisa menggesekkan dengan jari,false
sebaliknya.Saya menggunakan ini dalam proyek saya, dan itu berfungsi dengan baik sampai sekarang.
sumber
Saya menggunakan kelas ini dengan sukses. Override executeKeyEvent diperlukan untuk menghindari menggesekkan menggunakan panah di beberapa perangkat atau untuk aksesibilitas:
Dan di xml sebut seperti ini:
sumber
performClick()
metode tidak diganti.Di Kotlin, solusi saya, menggabungkan jawaban di atas.
sumber
onInterceptTouchEvent()
akan mencegah pandangan anak untuk menerima input. Dalam kebanyakan kasus ini bukan perilaku yang dimaksudkan.Di kotlin, kita bisa menyelesaikan ini dengan membuat widget khusus yang mewarisi kelas ViewPager dan menambahkan nilai flag untuk mengendalikan perilaku swipe.
NoSwipePager.kt
Dalam xml
Nonaktifkan menggesek secara pemrograman. Jika
kotlin-android-extensions
plugin diterapkan di build.gradle , menggesekkan dapat dinonaktifkan dengan menulis kode di bawah ini.Kalau tidak, kita dapat menonaktifkan menggesek menggunakan kode di bawah ini:
sumber
onInterceptTouchEvent()
akan mencegah pandangan anak untuk menerima input. Dalam kebanyakan kasus ini bukan perilaku yang dimaksudkan.super.onInterceptTouchEvent(event)
hasil dalam tampilan ini tidak menerima input apa pun (yang merupakan tujuanonInterceptTouchEvent
metode yang didokumentasikan ).onInterceptTouchEvent()
metode utama mencegahnya (konten) menerima input.Cobalah mengesampingkan dan mengembalikan true dari onInterceptTouchEvent () dan / atau onTouchEvent () , yang akan mengkonsumsi acara sentuh pada pager.
sumber
true
untuk menyiratkan bahwa acara sentuhan telah ditangani?Solusi mudah lain untuk menonaktifkan menggesekkan pada halaman tertentu (dalam contoh ini, halaman 2):
sumber
sumber
Jika Anda menulis galeri gambar dengan
ImageView
s danViewPager
, yang mendukung zoom dan pan, lihat solusi sederhana yang dijelaskan di sini: Menerapkan ImageView yang dapat diperbesar dengan Memperluas ViewPager Default di Phimpme Android (dan sampel Github - PhotoView ). Solusi ini tidak bekerja denganViewPager
sendirian.sumber
Jika Anda menggunakan ViewPager2, Anda hanya perlu menggunakan:
viewpager.setUserInputEnabled(false);
Dari dokumen :
Terima kasih kepada: https://stackoverflow.com/a/61685871/9026710
sumber
Jika Anda ingin menerapkan hal yang sama untuk Android di Xamarin, berikut adalah terjemahan ke C #
Saya memilih untuk memberi nama atribut " ScrollEnabled ". Karena iOS hanya menggunakan penamaan yang sama excat. Jadi, Anda memiliki penamaan yang sama di kedua platform, membuatnya lebih mudah bagi pengembang.
Dalam file .axml:
sumber
Tidak satu pun dari kode di atas yang berfungsi dengan lancar. Saya mencoba ini
sumber
di sini adalah implementasi saya
bahwa jika Anda ingin menonaktifkan animasi gesek Anda dapat menggunakan swipeListener kiri dan kanan dan masih ingin gulir dengan jari tetapi tanpa animasi
Viewpager
Metode 1-OverrideonInterceptTouchEvent
danonTouchEvent
2- buat milik Anda sendiri
GestureDetector
3 - mendeteksi gerakan menggesek dan menggunakan
setCurrentItem(item, false)
ViewPager
ketika Anda mengatur ViewPager mengatur swipeListener
sumber
Saya hanya mengkustomisasi viewpager sedikit dan menonaktifkan swiping dengan mudah.
sumber
sumber