Estoy intentando deshabilitar que el usuario se arrastre BottomSheet
. La razón por la que quiero inhabilitar son dos cosas. 1. Evita que se ListView
desplace hacia abajo, 2. No quiero que los usuarios descarten el uso de arrastrar pero con un botón en BottomSheetView
. Esto es lo que he hecho
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;
}
}
});
}
});
El 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>
android
android-support-library
android-support-design
Abubakar Oladeji
fuente
fuente
Respuestas:
Puede que ahora ya no sea relevante, pero lo dejaré aquí:
Y utilícelo en su archivo xml:
Deshabilita todas las acciones de los usuarios, se puede usar cuando desee controlar BottomSheet solo mediante programación.
fuente
compruebe el estado en el
onStateChanged
método desetBottomSheetCallback
si el estado es yBottomSheetBehavior.STATE_DRAGGING
luego cámbielo deBottomSheetBehavior.STATE_EXPANDED
esta manera que puede detenerSTATE_DRAGGING
por el usuario. como abajouse el botón para abrir cerrar la hoja inferior como se muestra a continuación
no use
setPeekHeight
oapp:behavior_peekHeight
por la forma anterior puedes alcanzar tu meta
fuente
BottomSheet View
match_parent
y cada vez que trato de abrirlo en miActivity
, noté que se desliza hacia arriba, pero no es visible hasta que loEditText
Keyboard
BottomSheet View
STATE_SETTLING
. Tengo un botón para abrir y cerrar la hoja inferior, si está OCULTO, lo amplío. Si está EXPANDIDO, lo oculto. Como se atasca en SETTLING, mi botón no funciona después de arrastrar la hoja inferior. ¿Alguna idea sobre eso?De acuerdo, entonces la respuesta aceptada no funcionó para mí. Sin embargo, la respuesta de Виталий Обидейко inspiró mi solución final.
Primero, creé el siguiente BottomSheetBehavior personalizado. Anula todos los métodos que involucran el tacto y devuelve falso (o no hizo nada) si está bloqueado. De lo contrario, actúa como un BottomSheetBehavior normal. Esto deshabilita la capacidad del usuario de arrastrar hacia abajo y no afecta el cambio de estado en el código.
LockableBottomSheetBehavior.java
Aquí tienes un ejemplo de cómo usarlo. En mi caso, lo necesitaba para que la hoja inferior se bloqueara cuando se expandía.
activity_home.xml
HomeActivity.java
¡Espero que esto ayude a aclarar mucha confusión!
fuente
Terminé escribiendo una solución para abordar este caso de uso de deshabilitar dinámicamente el arrastre del usuario, mediante el cual BottomSheetBehavior se subclasifica para anular onInterceptTouchEvent, e ignorarlo cuando una marca personalizada (en este caso, mAllowUserDragging) se establece en falso:
Y en su diseño xml:
Hasta ahora, esta es la solución de comportamiento más consistente para deshabilitar el arrastre del usuario en la hoja inferior a pedido.
Todas las otras soluciones que se basaron en disparar otra llamada setState en la devolución de llamada onStateChanged dieron como resultado que BottomSheet entrara en un mal estado o causara problemas significativos de UX (en el caso de publicar la llamada setState en un Runnable).
Espero que esto ayude a alguien :)
Rayo
fuente
bottomSheetFragContainer.setNestedScrollingEnabled(false);
Respuesta tardía, pero esto es lo que funcionó para mí, que es un poco diferente a lo que otros han sugerido.
Puede intentar establecer la
cancelable
propiedad en falso, es deciry luego manejando manualmente los eventos donde le gustaría descartar el diálogo en el
setupDialog
método.Esto funciona con un ListView dentro del fragmento de diálogo, que era donde me estaba quedando un poco atascado con otras soluciones.
fuente
event.isCanceled()
yevent.getAction() == MotionEvent.ACTION_UP
antes de cerrar el cuadro de diálogo; esto evitará que los clics erróneos activen el rechazo.La respuesta aceptada no funciona en el primer dispositivo de prueba que utilizo. Y el rebote no es suave. Parece mejor establecer el estado en STATE_EXPANDED solo después de que un usuario suelta el arrastre. La siguiente es mi versión:
fuente
Agregue este código al objeto BottomSheetBehavior . El arrastre estará deshabilitado. Funciona bien para mi.
fuente
Comportamiento esperado:
Código:
fuente
Para bloquear la hoja inferior y evitar que el usuario la deslice, esto es lo que hice
Funciona bastante bien para mi.
fuente
BottomSheetBehavior.STATE_HIDDEN
. En tal caso, tampoco debe llamarsetPeekHeight()
. Esto es mucho menos complicado que otras soluciones aquí.Una forma fácil de bloquear el arrastre es setPeekHeight igual que la altura de la vista. Por ejemplo:
fuente
Una muestra con BottomSheetDialogFragment. Funciona perfectamente.
Editar 04/09/2020: Reemplazado depreciado
setBottomSheetCallback()
conaddBottomSheetCallback()
fuente
No es necesario bloquear todos los eventos cuando la hoja inferior está desactivada. Solo puede bloquear el evento ACTION_MOVE. Es por eso que use un comportamiento de hoja inferior personalizado como este
fuente
Aquí hay una versión funcional de la mejor solución en Kotlin:
Entonces, cuando quieras usar:
Esta
bottom_sheet_main
es la vista real usando las extensiones de Android Kotlin .fuente
establezca bottomSheet onClickListener en nulo.
esta línea deshabilita todas las acciones sobre bottomSheet solamente y no afecta la vista interior.
fuente
puede deshabilitar el arrastre de BottomSheet de esta manera.
(kotlin), espero que esta respuesta pueda resolver su problema.
fuente
He encontrado una solución asombrosa. El problema inicial era que una vez que bottomSheet pasaba al estado HIDDEN, no aparecía en bottomSheetDialog.show (). Pero quería que el cuadro de diálogo fuera visible en el método show () y también quería permitir que el usuario lo deslizara hacia abajo para que se sintiera como la última hoja. A continuación se muestra lo que hice ...
fuente
BottomSheetDialog
a su proyecto y cambie el nombre aMyBottomSheetDialog
getBottomSheetBehavior
aMyBottomSheetDialog
MyBottomSheetDialog
en su lugarBottomSheetDialog
código como este
en tu código
fuente
Esta es básicamente la versión kotlin de la respuesta correcta en la parte superior:
fuente
Prueba esto.
1) Cree la hoja inferior y declare la variable en su clase java como
2)
sheetBehavior = BottomSheetBehavior.from(bottomSheet);
3) En la función de devolución de llamada de la hoja inferior, agregue las siguientes líneas.
fuente
Al principio, solo quiero dar las gracias a todos los que intentaron dar una respuesta. Solo estoy escribiendo esta respuesta resolviendo este problema como quiero. Voy a describir cómo lo hago paso a paso tomando ayuda desde aquí.
Visualización: Después de hacer clic en el botón
Show BottomSheet
, verá la segunda pantalla . Ahora verá que BottomSheet está bloqueado para arrastrar . Pero si hace clic en la lista de países, la hoja inferior se ocultará. Esta fue la descripción. Ahora profundicemos en el Código.Al principio, agregue la biblioteca de soporte de diseño a su archivo build.gradle :
UserLockBottomSheetBehavior.java : Crédito: James Davis (Gracias hombre)
fuente
La solución de la respuesta aceptada funcionó principalmente para mí, pero con un problema: las vistas, que están detrás de la vista de la hoja inferior, comenzaron a reaccionar en los eventos táctiles, si el evento táctil ocurre en el área de la hoja inferior, que está libre de vistas secundarias. En otras palabras, como puede ver en la imagen a continuación, cuando el usuario desliza el dedo dentro de la hoja inferior, el mapa comienza a reaccionar.
Para solucionar el problema, modifiqué el
onInterceptTouchEvent
método estableciendotouchListener
en la vista de hoja inferior (el resto del código sigue siendo el mismo que en la solución aceptada).fuente
Con
'com.google.android.material:material:1.2.0-alpha06'
Funciona muy bien con
NestedScrollView
yRecyclerView
Código de ejemplo:
fuente
Ajustar el
peakHeight
valor funcionó para mí.fuente
fuente
este es el primer resultado en google, así que creo que es justo poner la solución simple aquí:
y que simplemente llamarlo desde
onCreateView()
en laBottomSheetDialogFragment
implementaciónfuente
Tengo el mismo problema
BottomSheetDialogFragment
y aplico muchas soluciones usando elbehavior
dedialog
pero ninguno de ellos resuelve mi problema y luego lo resolví pero configurésetCancelable(false);
en el momento de la inicialización dedialog
.Esto desactivará el gesto
BottomSheetDialogFragment
y puede descartarlodialog
mediante programación usando ladismiss();
función.fuente
Tuve el mismo problema, lo resolví por código. No permitirá que el usuario arrastre la hoja inferior. necesita manejar el estado mediante programación.
fuente
Simplemente use:
bottomSheet.dismissOnDraggingDownSheet = false
Copiado del sitio web Material.io:
let viewController: ViewController = ViewController() let bottomSheet: MDCBottomSheetController = MDCBottomSheetController(contentViewController: viewController)
// **** Esta línea evita descartar arrastrando bottomSheet ****
bottomSheet.dismissOnDraggingDownSheet = false
present(bottomSheet, animated: true, completion: nil)
fuente