Saya mencoba untuk menonaktifkan pengguna yang menyeret BottomSheet
. Alasan saya ingin menonaktifkan adalah dua hal. 1. Ini mencegah ListView
dari pengguliran ke bawah, 2. Saya tidak ingin pengguna mengabaikan menggunakan menyeret tetapi dengan tombol di BottomSheetView
. Inilah yang telah saya lakukan
bottomSheetBehavior = BottomSheetBehavior.from(bottomAnc);
bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
if (newState == BottomSheetBehavior.STATE_EXPANDED) {
//Log.e("BottomSheet", "Expanded");
} else if (newState == BottomSheetBehavior.STATE_COLLAPSED) {
//Log.e("BottomSheet", "Collapsed");
}
}
@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
// React to dragging events
bottomSheet.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = MotionEventCompat.getActionMasked(event);
switch (action) {
case MotionEvent.ACTION_DOWN:
return false;
default:
return true;
}
}
});
}
});
The bottomSheetLayout
<?xml version="1.0" encoding="utf-8"?><FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
app:behavior_hideable="true"
app:behavior_peekHeight="0dp"
app:layout_behavior="@string/bottom_sheet_behavior"
android:id="@+id/bottomSheet">
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:elevation="10dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical">
<TextView
android:id="@+id/text1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Order Items"
android:layout_margin="16dp"
android:textAppearance="@android:style/TextAppearance.Large"/>
<Button
android:layout_width="50dp"
android:layout_height="wrap_content"
android:layout_marginRight="5dp"
android:background="@drawable/bg_accept"/>
<Button
android:layout_width="50dp"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
android:background="@drawable/bg_cancel"/>
</LinearLayout>
<ListView
android:id="@+id/item_edit"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:divider="@color/md_divider_black"
android:dividerHeight="1dp"/>
</LinearLayout>
</android.support.v7.widget.CardView>
Jawaban:
Sekarang mungkin sudah tidak relevan lagi, tetapi saya akan meninggalkannya di sini:
Dan gunakan di file xml Anda:
Ini menonaktifkan semua tindakan pengguna, ini dapat digunakan ketika Anda ingin mengontrol BottomSheet hanya secara terprogram.
sumber
periksa status dalam
onStateChanged
metodesetBottomSheetCallback
jika statusBottomSheetBehavior.STATE_DRAGGING
kemudian ubah keBottomSheetBehavior.STATE_EXPANDED
cara ini Anda dapat berhentiSTATE_DRAGGING
oleh pengguna. seperti dibawah inigunakan tombol untuk membuka tutup lembaran bawah seperti di bawah ini
jangan gunakan
setPeekHeight
atauapp:behavior_peekHeight
dengan cara di atas Anda dapat mencapai tujuan Anda
sumber
BottomSheet View
match_parent
dan setiap kali saya mencoba untuk memunculkannya di saya,Activity
saya perhatikan itu meluncur ke atas, tetapi tidak terlihat sampai saya mengetuknyaEditText
yang memunculkanKeyboard
dan membuatnyaBottomSheet View
terlihatSTATE_SETTLING
. Saya memiliki tombol untuk membuka dan menutup lembaran bawah, jika TERSEMBUNYI, saya perluas. Jika DIPERLUAS, saya menyembunyikannya. Karena macet di SETTLING, tombol saya tidak berfungsi setelah menyeret lembar bawah. Ada ide tentang itu?Baiklah, jadi jawaban yang diterima tidak berhasil untuk saya. Namun, jawaban Виталий Обидейко menginspirasi solusi akhir saya.
Pertama, saya membuat BottomSheetBehavior kustom berikut. Ini mengesampingkan semua metode yang melibatkan sentuhan, dan mengembalikan false (atau tidak melakukan apa pun) jika terkunci. Jika tidak, itu bertindak seperti BottomSheetBehavior normal. Ini menonaktifkan kemampuan pengguna untuk menyeret ke bawah, dan tidak memengaruhi pengubahan status dalam kode.
LockableBottomSheetBehavior.java
Berikut contoh cara menggunakannya. Dalam kasus saya, saya membutuhkannya agar Lembaran Bawah terkunci saat diperluas.
activity_home.xml
HomeActivity.java
Semoga ini bisa membantu menjernihkan banyak kebingungan!
sumber
Saya akhirnya menulis solusi untuk mengatasi kasus penggunaan penonaktifan pengguna secara dinamis ini, di mana BottomSheetBehavior disubkelas untuk menimpa onInterceptTouchEvent, dan untuk mengabaikannya ketika bendera khusus (dalam hal ini mAllowUserDragging) disetel ke false:
Dan dalam tata letak xml Anda:
Sejauh ini, ini adalah solusi yang berperilaku paling konsisten untuk menonaktifkan pengguna yang menyeret di Lembar Bawah sesuai permintaan.
Semua solusi lain yang mengandalkan pengaktifan panggilan setState lain dalam callback onStateChanged mengakibatkan BottomSheet menjadi status yang buruk, atau menyebabkan masalah UX yang signifikan (dalam kasus memposting panggilan setState dalam Runnable).
Semoga ini bisa membantu seseorang :)
sinar
sumber
bottomSheetFragContainer.setNestedScrollingEnabled(false);
Jawaban terlambat, tetapi, inilah yang berhasil bagi saya, yang sedikit berbeda dengan apa yang disarankan orang lain.
Anda dapat mencoba menyetel
cancelable
properti ke false, yaitulalu secara manual menangani kejadian di mana Anda ingin menutup dialog dalam
setupDialog
metode.Ini berfungsi dengan ListView di dalam fragmen dialog, di mana saya sedikit terjebak dengan solusi lain.
sumber
event.isCanceled()
danevent.getAction() == MotionEvent.ACTION_UP
sebelum menutup dialog - ini akan mencegah kesalahan klik memicu penutupan.Jawaban yang diterima tidak berfungsi pada perangkat uji pertama yang saya gunakan. Dan pantulannya kembali tidak mulus. Tampaknya lebih baik menyetel status menjadi STATE_EXPANDED hanya setelah pengguna melepaskan penyeretan. Berikut ini adalah versi saya:
sumber
Tambahkan kode ini ke objek BottomSheetBehavior . Menarik akan dinonaktifkan. Bekerja dengan baik untuk saya.
sumber
Perilaku yang diharapkan:
Kode:
sumber
Untuk mengunci BottomSheet dan menghindari pengguna untuk menggeseknya, inilah yang saya lakukan
Ini bekerja cukup baik untuk saya.
sumber
BottomSheetBehavior.STATE_HIDDEN
. Dalam kasus seperti itu, Anda juga tidak boleh meneleponsetPeekHeight()
. Ini jauh lebih mudah daripada solusi lain di sini.Cara mudah untuk mengunci menyeret adalah setPeekHeight sama dengan ketinggian tampilan. Sebagai contoh:
sumber
Sampel dengan BottomSheetDialogFragment. Ini bekerja dengan sempurna.
Edit 09/04/2020: Mengganti depresiasi
setBottomSheetCallback()
denganaddBottomSheetCallback()
sumber
Anda tidak perlu memblokir semua acara saat lembar bawah dinonaktifkan. Anda hanya dapat memblokir acara ACTION_MOVE. Itulah mengapa gunakan perilaku lembar bawah khusus seperti ini
sumber
Berikut adalah versi kerja dari solusi teratas di Kotlin:
Kemudian kapan pun Anda ingin menggunakan:
Ini
bottom_sheet_main
adalah tampilan sebenarnya menggunakan Kotlin Android Extensions .sumber
setel bottomSheet onClickListener ke null.
baris ini menonaktifkan semua tindakan tentang bottomSheet saja dan tidak berpengaruh pada tampilan dalam.
sumber
Anda dapat menonaktifkan menyeret BottomSheet seperti ini.
(kotlin), saya harap jawaban ini dapat menyelesaikan masalah Anda.
sumber
Saya telah menemukan solusi yang luar biasa. Masalah awal adalah ketika bottomSheet akan menjadi status HIDDEN kemudian tidak muncul di bottomSheetDialog.show (). Tapi saya ingin dialog terlihat pada metode show () dan juga ingin memungkinkan pengguna untuk menggeseknya ke bawah sehingga terasa seperti lembaran bawah. Di bawah ini yang saya lakukan ..
sumber
BottomSheetDialog
ke proyek Anda dan ganti namanya menjadiMyBottomSheetDialog
getBottomSheetBehavior
keMyBottomSheetDialog
MyBottomSheetDialog
sebagai gantinyaBottomSheetDialog
kode seperti ini
dalam kode Anda
sumber
Ini pada dasarnya adalah versi kotlin dari jawaban yang benar di atas:
sumber
Dengan
'com.google.android.material:material:1.2.0-alpha06'
Sangat cocok dengan
NestedScrollView
danRecyclerView
Kode contoh:
sumber
Coba ini.
1) Buat lembar bawah dan deklarasikan variabel di kelas java Anda seperti
2)
sheetBehavior = BottomSheetBehavior.from(bottomSheet);
3) Di fungsi panggilan balik lembar bawah tambahkan baris berikut.
sumber
Awalnya, saya hanya ingin mengucapkan terima kasih kepada kalian semua yang mencoba memberikan jawaban. Saya hanya menulis jawaban ini dengan memecahkan masalah ini seperti yang saya inginkan. Saya akan menjelaskan bagaimana saya melakukannya selangkah demi selangkah dengan mengambil bantuan dari sini.
Visualisasi: Setelah mengklik Tombol,
Show BottomSheet
Anda akan melihat layar kedua . Sekarang Anda akan melihat bahwa BottomSheet baru saja dikunci untuk menyeret . Tetapi jika Anda mengklik Daftar Negara , BottomSheet akan bersembunyi. Ini adalah deskripsinya sekarang mari kita gali Kode.Pertama-tama, tambahkan pustaka dukungan desain ke file build.gradle Anda :
UserLockBottomSheetBehavior.java : Kredit: James Davis (Thanks Man)
sumber
Solusi dari jawaban yang diterima sebagian besar berhasil untuk saya, tetapi dengan satu masalah: pandangan, yang berada di belakang tampilan lembar bawah, mulai bereaksi pada peristiwa sentuh, jika peristiwa sentuhan terjadi di area lembaran bawah, yang bebas dari pandangan anak. Dengan kata lain, seperti yang terlihat pada gambar di bawah ini, ketika pengguna menyelipkan jari ke dalam lembaran bawah, peta mulai bereaksi.
Untuk memperbaiki masalah ini, saya telah memodifikasi
onInterceptTouchEvent
metode dengan mengaturtouchListener
tampilan lembar bawah (kode lainnya tetap sama seperti dalam solusi yang diterima).sumber
Menyesuaikan
peakHeight
nilai berhasil bagi saya.sumber
sumber
ini adalah hasil pertama di google jadi saya yakin adil untuk meletakkan solusi sederhana di sini:
dan dari sekadar memanggilnya dari
onCreateView()
dalamBottomSheetDialogFragment
implementasisumber
Saya memiliki masalah yang sama
BottomSheetDialogFragment
dan menerapkan banyak solusi menggunakanbehavior
daridialog
tetapi tidak ada yang menyelesaikan masalah saya dan kemudian saya menyelesaikannya tetapi mengatursetCancelable(false);
pada saat inisialisasidialog
.Ini akan menonaktifkan gerakan aktif
BottomSheetDialogFragment
dan Anda dapat menutup secaradialog
terprogram dengan menggunakandismiss();
fungsi.sumber
Saya memiliki masalah yang sama, saya menyelesaikannya dengan kode. Ini tidak akan mengizinkan pengguna untuk menyeret lembar bawah. Anda perlu menangani status secara terprogram.
sumber
Cukup gunakan:
bottomSheet.dismissOnDraggingDownSheet = false
Disalin dari situs Material.io:
let viewController: ViewController = ViewController() let bottomSheet: MDCBottomSheetController = MDCBottomSheetController(contentViewController: viewController)
// **** Baris ini mencegah penutupan dengan menyeret bottomSheet ****
bottomSheet.dismissOnDraggingDownSheet = false
present(bottomSheet, animated: true, completion: nil)
sumber