J'essaie de désactiver le glissement de l'utilisateur BottomSheet
. La raison pour laquelle je veux désactiver est deux choses. 1. Cela empêche le ListView
de défiler vers le bas, 2. Je ne veux pas que les utilisateurs abandonnent en utilisant le glissement mais avec un bouton sur le BottomSheetView
. C'est ce que j'ai fait
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;
}
}
});
}
});
Le 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>
Réponses:
Cela peut maintenant ne plus être pertinent, mais je vais le laisser ici:
Et utilisez-le dans votre fichier xml:
Il désactive toutes les actions des utilisateurs, il peut être utilisé lorsque vous souhaitez contrôler BottomSheet uniquement par programme.
la source
vérifier l'état dans la
onStateChanged
méthodesetBottomSheetCallback
si l'état estBottomSheetBehavior.STATE_DRAGGING
alors changez-le deBottomSheetBehavior.STATE_EXPANDED
cette façon, vous pouvez arrêterSTATE_DRAGGING
par l'utilisateur. comme ci-dessousutilisez le bouton pour ouvrir la feuille inférieure comme ci-dessous
ne pas utiliser
setPeekHeight
ouapp:behavior_peekHeight
par dessus, vous pouvez atteindre votre objectif
la source
BottomSheet View
match_parent
et chaque fois que j'essaie de le faire apparaître dans mon,Activity
j'ai remarqué qu'il glissait vers le haut, mais ce n'est pas visible tant que je n'ai pasEditText
Keyboard
BottomSheet View
STATE_SETTLING
. J'ai un bouton pour ouvrir et fermer la feuille du bas, si elle est CACHÉE, je la développe. S'il est EXPANSÉ, je le cache. Comme il reste bloqué dans SETTLING, mon bouton ne fonctionne pas après avoir fait glisser la feuille du bas. Une idée là-dessus?D'accord, donc la réponse acceptée n'a pas fonctionné pour moi. Cependant, la réponse de Виталий Обидейко inspiré ma solution finale.
Tout d'abord, j'ai créé le BottomSheetBehavior personnalisé suivant. Il remplace toutes les méthodes impliquant le toucher et renvoie false (ou n'a rien fait) s'il est verrouillé. Sinon, il agit comme un BottomSheetBehavior normal. Cela désactive la capacité de l'utilisateur à faire glisser vers le bas et n'affecte pas la modification de l'état dans le code.
LockableBottomSheetBehavior.java
Voici un exemple de son utilisation. Dans mon cas, j'en avais besoin pour que la feuille inférieure soit verrouillée une fois développée.
activity_home.xml
HomeActivity.java
J'espère que cela aidera à dissiper une grande partie de la confusion!
la source
J'ai fini par écrire une solution de contournement pour résoudre ce cas d'utilisation de désactivation dynamique du glissement utilisateur, dans lequel BottomSheetBehavior est sous-classé pour remplacer onInterceptTouchEvent, et pour l'ignorer lorsqu'un indicateur personnalisé (dans ce cas, mAllowUserDragging) est défini sur false:
Et dans votre mise en page xml:
Jusqu'à présent, il s'agit de la solution la plus cohérente pour désactiver le glissement utilisateur sur la feuille du bas à la demande.
Toutes les autres solutions qui reposaient sur le déclenchement d'un autre appel setState dans le rappel onStateChanged ont abouti à un mauvais état de BottomSheet ou à des problèmes UX importants (dans le cas de la publication de l'appel setState dans un Runnable).
J'espère que cela aide quelqu'un :)
Rayon
la source
bottomSheetFragContainer.setNestedScrollingEnabled(false);
Réponse tardive, mais c'est ce qui a fonctionné pour moi, ce qui est un peu différent de ce que d'autres ont suggéré.
Vous pouvez essayer de définir la
cancelable
propriété sur false, c'est-à-direpuis gérer manuellement les événements pour lesquels vous souhaitez fermer la boîte de dialogue dans la
setupDialog
méthode.Cela fonctionne avec un ListView à l'intérieur du fragment de boîte de dialogue, où je me retrouvais un peu coincé avec d'autres solutions.
la source
event.isCanceled()
etevent.getAction() == MotionEvent.ACTION_UP
avant de fermer la boîte de dialogue - cela empêchera les faux-clics de déclencher le rejet.La réponse acceptée ne fonctionne pas sur le premier appareil de test que j'utilise. Et le rebond n'est pas fluide. Il semble préférable de définir l'état sur STATE_EXPANDED uniquement après qu'un utilisateur a relâché le glissement. Voici ma version:
la source
Ajoutez ce code à l' objet BottomSheetBehavior . Le glissement sera désactivé. Fonctionne bien pour moi.
la source
Comportement prévisible:
Code:
la source
Pour verrouiller le BottomSheet et éviter à l'utilisateur de le faire glisser, c'est ce que j'ai fait
Cela fonctionne assez bien pour moi.
la source
BottomSheetBehavior.STATE_HIDDEN
. Dans ce cas, vous ne devez pas non plus appelersetPeekHeight()
. C'est beaucoup moins compliqué que d'autres solutions ici.Un moyen facile de verrouiller le glissement est de définirPeekHeight comme la hauteur de la vue. Par exemple:
la source
Un exemple avec BottomSheetDialogFragment. Cela fonctionne parfaitement.
Edit 09/04/2020: Remplacé amorti
setBottomSheetCallback()
paraddBottomSheetCallback()
la source
Vous n'avez pas besoin de bloquer tous les événements lorsque la feuille du bas est désactivée. Vous ne pouvez bloquer que l'événement ACTION_MOVE. C'est pourquoi utiliser un comportement de feuille de fond personnalisé comme celui-ci
la source
Voici une version fonctionnelle de la meilleure solution de Kotlin:
Puis chaque fois que vous voulez utiliser:
Il
bottom_sheet_main
s'agit de la vue réelle utilisant les extensions Android Kotlin .la source
définissez bottomSheet onClickListener sur null.
cette ligne désactive toutes les actions sur bottomSheet uniquement et n'affecte pas la vue intérieure.
la source
vous pouvez désactiver le glissement du BottomSheet comme ceci.
(kotlin), j'espère que cette réponse pourra résoudre votre problème.
la source
J'ai trouvé une solution incroyable. Le problème initial était qu'une fois que bottomSheet passait à l'état HIDDEN, il ne s'affichait pas à bottomSheetDialog.show (). Mais je voulais que la boîte de dialogue soit visible sur la méthode show () et je voulais également permettre à l'utilisateur de la faire glisser vers le bas pour qu'elle ressemble à la feuille du bas. Voici ce que j'ai fait.
la source
BottomSheetDialog
dans votre projet et renommez-le enMyBottomSheetDialog
getBottomSheetBehavior
àMyBottomSheetDialog
MyBottomSheetDialog
placeBottomSheetDialog
code comme ça
dans votre code
la source
Ceci est essentiellement la version kotlin de la bonne réponse en haut:
la source
Essaye ça.
1) Créez la feuille du bas et déclarez la variable dans votre classe java comme
2)
sheetBehavior = BottomSheetBehavior.from(bottomSheet);
3) Dans la fonction de rappel de la feuille du bas, ajoutez les lignes suivantes.
la source
Au début, je veux juste remercier tous ceux qui ont essayé de donner une réponse. J'écris juste cette réponse en résolvant ce problème comme je le souhaite. Je vais décrire comment je fais cela étape par étape en prenant de l'aide d'ici.
Visualisation: Après avoir cliqué sur le bouton,
Show BottomSheet
vous verrez le deuxième écran . Vous verrez maintenant que BottomSheet est juste verrouillé pour le glisser . Mais si vous cliquez sur la liste des pays, la feuille du bas se cachera. C'était la description maintenant, creusons dans le code.Dans un premier temps, ajoutez la bibliothèque de support de conception à votre fichier build.gradle :
UserLockBottomSheetBehavior.java : Crédit: James Davis (Thanks Man)
la source
La solution de la réponse acceptée a principalement fonctionné pour moi, mais avec un problème: les vues, qui se trouvent derrière la vue inférieure de la feuille, ont commencé à réagir aux événements tactiles, si l'événement tactile se produit sur la zone de la feuille inférieure, qui est libre de vues enfants. En d'autres termes, comme vous pouvez le voir dans l'image ci-dessous, lorsque l'utilisateur glisse le doigt à l'intérieur de la feuille inférieure, la carte commence à réagir.
Pour résoudre le problème, j'ai modifié la
onInterceptTouchEvent
méthode en définissant la vuetouchListener
du bas de la feuille (le reste du code reste le même que dans la solution acceptée).la source
Avec
'com.google.android.material:material:1.2.0-alpha06'
Fonctionne très bien avec
NestedScrollView
etRecyclerView
Exemple de code:
la source
Ajuster la
peakHeight
valeur a fonctionné pour moi.la source
la source
c'est le premier résultat dans google, donc je pense que c'est juste de mettre la solution simple ici:
et que de simplement l'appeler depuis
onCreateView()
laBottomSheetDialogFragment
mise en œuvrela source
J'ai le même problème
BottomSheetDialogFragment
et j'applique de nombreuses solutions à l'aide debehavior
ofdialog
mais aucune de celles-ci ne résout mon problème, puis je l'ai résolu en définissantsetCancelable(false);
au moment de l'initialisation dedialog
.Cela désactivera le geste sur
BottomSheetDialogFragment
et vous pouvez ignorerdialog
par programme en utilisant ladismiss();
fonction.la source
J'ai eu le même problème, je l'ai résolu par code. Cela ne permettra pas à l'utilisateur de faire glisser la feuille de fond. vous devez gérer l'état par programme.
la source
Utilisez simplement:
bottomSheet.dismissOnDraggingDownSheet = false
Copié du site Web Material.io:
let viewController: ViewController = ViewController() let bottomSheet: MDCBottomSheetController = MDCBottomSheetController(contentViewController: viewController)
// **** Cette ligne empêche le rejet en faisant glisser bottomSheet ****
bottomSheet.dismissOnDraggingDownSheet = false
present(bottomSheet, animated: true, completion: nil)
la source