Saya memiliki lembaran bawah yang harus berada di antara 2 negara, STATE_COLLAPSED
dan STATE_EXPANDED
ketika itu runtuh, seharusnya tinggi 200dp
dan ketika diperluas itu akan menjadi layar penuh.
Jadi saya mengatur BottomSheetBehavior
dengan
isFitToContents = false
peekHeight = 200dp
dan saya dipaksa untuk menetapkan nilai halfExpandedRatio
sebaliknya jika di STATE_HALF_EXPANDED
bagian bawah lembar akan mengambil setengah dari layar.
Saya bekerja dengan com.google.android.material:material:1.1.0-rc01
Apakah ada cara untuk menonaktifkan STATE_HALF_EXPANDED
negara?
Atau saya harus benar-benar menetapkan skipCollapsed=true
, mencari tahu dalam hal rasio apa arti 200dp dan bekerja dengan STATE_HALF_EXPANDED
dan STATE_EXPANDED
bukannya STATE_COLLAPSED
danSTATE_EXPANDED
android
material-components-android
Noa Drach
sumber
sumber
halfExpandedRatio=0.25f
danpeekHeight = 200dp
kemudian mengobatiSTATE_COLLAPSED
danSTATE_HALF_EXPANDED
seolah-olah mereka adalah memecahkan keadaan yang sama masalah ini. Menjaga pertanyaan tetap terbuka jika ada ide lain.Jawaban:
Nilai rasio setengah diperluas harus ditetapkan ke beberapa nilai antara 0 dan 1 eksklusif , jadi set nilai ini ke beberapa angka yang sangat rendah yang pasti kurang dari ketinggian mengintip Anda, katakan "0,0001f". Dengan nilai ini Anda bahkan tidak harus melihat
STATE_HALF_EXPANDED
negara. Negara akan berfluktuasi antaraSTATE_EXPANDED
danSTATE_COLLAPSED
.Solusi alternatif
Solusi di atas berfungsi dan secara efektif menonaktifkan
STATE_HALF_EXPANDED
negara, tetapi itu adalah peretasan (IMO) dan mungkin pecah di masa depan. Misalnya, bagaimana jika nilai wajar untuk rasio setengah diperluas yang berada di suatu tempat antara ketinggian mengintip dan ketinggian penuh diberlakukan? Itu akan menjadi masalah.Persyaratan sebagaimana dinyatakan oleh OP adalah bahwa lembaran bawah harus bertransisi antara ketinggian mengintip dan ketinggian penuh. Tidak ada masalah dengan ketinggian mengintip, tetapi OP menentukan
isFitToContents = false
untuk mencapai ketinggian penuh. (Saya berasumsi bahwa lembaran bawahnya mungkin lebih pendek daripada ruang yang tersedia.)Sayangnya kapan
isFitToContents == false
perilaku "setengah tinggi" tambahan diperkenalkan bahwa OP ingin menghindari dan karena itu pertanyaannya.Selain perilaku "setengah tinggi" perilaku lain diperkenalkan yang merupakan "diperluas offset." Offset yang diperluas menentukan seberapa jauh dari layar penuh lembar bawah akan berhenti. Nilai
100f
, misalnya, akan meninggalkan100px
batas di bagian atas lembar bawah saat diperluas penuh. Default untuk offset yang diperluas adalah nol.Saya tidak mengetahui adanya perilaku itu
isFitToContents == false
memperkenalkan selain dari yang disebutkan di atas.Jadi, mengingat persyaratan ini, dapatkah kita membuat lembaran bawah yang bergerak antara ketinggian mengintip dan ketinggian penuh saat menentukan
isFitToContents == true
sehingga menghindari masalah "setengah tinggi"? Tidak ada persyaratan untuk offset yang diperluas tanpa nol, jadi kami tidak perlu khawatir tentang itu.Berikut ini adalah aplikasi demo singkat yang menunjukkan bahwa kami dapat memenuhi persyaratan ini dengan struktur lembar kanan bawah:
MainActivity5.kt
BaseActivity.kt
activity_main5.xml
Jika kami memiliki lembar bawah yang panjang maka struktur berikut berfungsi untuk menggulirnya:
activity_main6.xml
sumber
isFitToContents = false
, tetapi pengujian sekarang dgisFitToContents = true
bekerja dengan baiksheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
ketika setengah diperluas negara tercapai, tetapi itu menjadi sedikit rumit. Solusi alternatif lebih baik.Jika Anda ingin mencoba di atas seperti pada gambar, Anda dapat mengikuti kode di bawah ini, semoga membantu Anda !!!
sumber
coba atur
addBottomSheetCallback
pada AndaBottomSheetBehavior
, dan ketika Anda mendeteksiSTATE_HALF_EXPANDED
keadaan, panggilsetState(STATE_HIDDEN)
jadi kapan pun lembar bawah mencoba mencapai keadaan setengah, itu hanya akan menutup.sumber
STATE_COLLAPSED
dan tidakSTATE_HIDDEN
. Tapi saya mencoba untuk menerapkannya dan transisi dariSTATE_HALF_EXPANDED
keSTATE_COLLAPSED
terasa kikuk. Transisi antar negara dianimasikan, sehingga Anda melihat lembaran bawah berhentiSTATE_HALF_EXPANDED
dan kemudian pindah keSTATE_COLLAPSED
halfExpandedState=0.25f
, b / c maka transisi antar negara tidak akan semudah ini. Tapi, saya tidak yakin itu akan menjadi perubahan besar dibandingkan dengan apa yang sudah saya milikiSaya memiliki kasus penggunaan serupa di mana tata letak harus sepertiga dari ketinggian. Saya mencoba yang berikut dan itu berhasil.
Saya harus mengubah ini secara dinamis jadi saya mengatur yang berikut di lembar bawah tetapi Anda dapat melakukannya dalam xml juga:
Untuk mengabaikan, saya menambahkan animasi ke fragmen saya menggunakan fungsi berikut:
Semoga ini membantu
sumber
Coba pengaturan
BottomSheetBehavior
.setHalfExpandedRatio(0f)
. Tidak banyak hal lain yang akan memengaruhiSTATE_HALF_EXPANDED
, kecuali secara eksplisit mengatur status dengan .setState () . Seharusnya juga dimungkinkan untuk membuat kebiasaanBehavior
, yang diperluasCoordinatorLayout.Behavior<View>
dan tidak adaSTATE_HALF_EXPANDED
. misalnya. Mencegat segalanya dengan Perilaku CoordinatorLayout .sumber
Saya mencoba berbagai cara, tetapi tidak ada teknik yang bekerja sempurna. Saya mencoba mencegat peristiwa
BottomSheetBehavior.BottomSheetCallback {}
dan menelepondismiss()
berdasarkan logika kustom tetapi menyebabkan brengsek.Jadi, akhirnya, In my
BottomSheetDialogFragment
menambahkanbottomSheetBehavior.isDraggable = false
dan ini menyebabkan menyeret lembar bawah dengan sentuhan Dan, saya menangani pemberhentian dialog saya sendiri. pada dialog area kosong, bagaimanapun juga dapat diberhentikan.Perhatikan bahwa, Lembar bawah masih mengembang dengan animasi. Benar-benar hebat!
menimpa kesenangan onCreateDialog (disimpanInstanceState: Bundel?): Dialog {val dialog = super.onCreateDialog (disimpanInstanceState)
sumber