Deaktivieren des Benutzer-Ziehens auf BottomSheet

99

Ich versuche, das Ziehen von Benutzern zu deaktivieren BottomSheet. Der Grund, warum ich deaktivieren möchte, sind zwei Dinge. 1. Es verhindert, dass das ListViewBild nach unten gescrollt wird. 2. Ich möchte nicht, dass Benutzer das Ziehen durch Ziehen schließen, sondern mit einer Schaltfläche auf dem BottomSheetView. Das habe ich getan

 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;
                    }
                }
            });
        }
    });

Das 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>

Abubakar Oladeji
quelle
Bitte überprüfen Sie meine Antwort. Ich habe bemerkt, dass es relevanter ist als akzeptierte Antwort
Vitalii Obideiko

Antworten:

92

Es kann jetzt nicht mehr relevant sein, aber ich werde es hier lassen:

import android.content.Context
import android.util.AttributeSet
import androidx.coordinatorlayout.widget.CoordinatorLayout
import android.view.MotionEvent
import android.view.View
import com.google.android.material.bottomsheet.BottomSheetBehavior

@Suppress("unused")
class LockableBottomSheetBehavior<V : View> : BottomSheetBehavior<V> {
    constructor() : super()
    constructor(context: Context, attrs: AttributeSet) : super(context, attrs)

    var swipeEnabled = true

    override fun onInterceptTouchEvent(
        parent: CoordinatorLayout,
        child: V,
        event: MotionEvent
    ): Boolean {
        return if (swipeEnabled) {
            super.onInterceptTouchEvent(parent, child, event)
        } else {
            false
        }
    }

    override fun onTouchEvent(parent: CoordinatorLayout, child: V, event: MotionEvent): Boolean {
        return if (swipeEnabled) {
            super.onTouchEvent(parent, child, event)
        } else {
            false
        }
    }

    override fun onStartNestedScroll(
        coordinatorLayout: CoordinatorLayout,
        child: V,
        directTargetChild: View,
        target: View,
        axes: Int,
        type: Int
    ): Boolean {
        return if (swipeEnabled) {
            super.onStartNestedScroll(
                coordinatorLayout,
                child,
                directTargetChild,
                target,
                axes,
                type
            )
        } else {
            false
        }
    }

    override fun onNestedPreScroll(
        coordinatorLayout: CoordinatorLayout,
        child: V,
        target: View,
        dx: Int,
        dy: Int,
        consumed: IntArray,
        type: Int
    ) {
        if (swipeEnabled) {
            super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type)
        }
    }

    override fun onStopNestedScroll(
        coordinatorLayout: CoordinatorLayout,
        child: V,
        target: View,
        type: Int
    ) {
        if (swipeEnabled) {
            super.onStopNestedScroll(coordinatorLayout, child, target, type)
        }
    }

    override fun onNestedPreFling(
        coordinatorLayout: CoordinatorLayout,
        child: V,
        target: View,
        velocityX: Float,
        velocityY: Float
    ): Boolean {
        return if (swipeEnabled) {
            super.onNestedPreFling(coordinatorLayout, child, target, velocityX, velocityY)
        } else {
            false
        }
    }
}

Und verwenden Sie es in Ihrer XML-Datei:

app:layout_behavior="com.your.package.LockableBottomSheetBehavior"

Es deaktiviert alle Benutzeraktionen und kann verwendet werden, wenn Sie BottomSheet nur programmgesteuert steuern möchten.

Vitalii Obideiko
quelle
2
Dies ist die beste Antwort zum Deaktivieren von BottomSheetBehaviour. Ein Mann oben hat ebenfalls eine ähnliche Lösung gepostet, aber er hat nicht geschrieben, um andere Ereignisse wie onTouchEvent () zu überschreiben . In anderen Seite können Sie Ihre Antwort verbessern , wenn Sie ein Flag setzen , anstatt falsch
murt
3
Wie benutzt man das mit einem BottomSheetFragment?
user3144836
7
Sie müssen in Ihrem XML speziell auf diese Klasse verweisen. app: layout_behavior = "com.my.package.UserLockBottomSheetBehavior"
Steve
3
In einigen Fällen funktioniert dies immer noch nicht. Wenn wir eine Liste im unteren Blattfragment haben, zieht sie sich immer noch hin
Deepak Joshi
1
@DeepakJoshi Vielleicht erweitern Sie RecyclerView und überschreiben einige Methoden wie 'hasNestedScrollingParent', aber ich bin nicht sicher
Vitalii Obideiko
73

Überprüfen Sie den Status in der onStateChangedMethode, setBottomSheetCallbackwenn der Status lautet, BottomSheetBehavior.STATE_DRAGGINGund ändern Sie ihn auf BottomSheetBehavior.STATE_EXPANDEDdiese Weise. Sie können ihn STATE_DRAGGINGvom Benutzer anhalten . Wie unten

final BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);
        behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
            @Override
            public void onStateChanged(@NonNull View bottomSheet, int newState) {
                if (newState == BottomSheetBehavior.STATE_DRAGGING) {
                    behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
                }
            }

            @Override
            public void onSlide(@NonNull View bottomSheet, float slideOffset) {
            }
        });

Verwenden Sie die Taste, um das untere Blatt wie unten zu schließen

fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (behavior.getState() == BottomSheetBehavior.STATE_HIDDEN) {
                    behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
                } else {
                    behavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
                }
            }
        });

benutze nicht setPeekHeightoderapp:behavior_peekHeight

Auf diese Weise können Sie Ihr Ziel erreichen

Dhaval Parmar
quelle
1
Guter Trick. Hab das nicht bemerkt. Vielen Dank. Und können Sie auch dabei helfen? Wenn ich es zuerst erweitern soll, ist es transparent und ich kann die Ansicht dahinter sehen, aber ich kann nicht interagieren, bis ich in der SheetView auf den EditText tippe, bevor ich ihn sichtbar mache.
Abubakar Oladeji
Ich habe mein gemacht BottomSheet View match_parentund wann immer ich versuche, es in meinem Activityaufzurufen, habe ich bemerkt, dass es nach oben rutscht, aber es ist nicht sichtbar, bis ich auf das EditTextdrin tippe, das Keyboarddas BottomSheet View
aufruft
1
Ich habe es versucht, aber die Staaten landen in STATE_SETTLING. Ich habe eine Schaltfläche zum Öffnen und Schließen des unteren Blattes. Wenn es VERSTECKT ist, erweitere ich es. Wenn es ERWEITERT ist, verstecke ich es. Da es in SETTLING hängen bleibt, funktioniert meine Schaltfläche nach dem Ziehen des unteren Blattes nicht mehr. Irgendeine Idee dazu?
Gokhan Arik
3
Diese Lösung ist unzuverlässig; Das untere Blatt wird in einen schlechten Zustand versetzt, wie Gokhan sagte ... und wenn in diesem schlechten Zustand Anrufe wie das Laden eines neuen Fragments in das untere Blatt einfach ausgeblendet werden.
Ray W
7
Es wird nicht funktionieren, wenn Sie Nestedscrollview im unteren Blatt haben
Rishabh Chandel
32

Okay, die akzeptierte Antwort hat bei mir nicht funktioniert. Die Antwort von Виталий Обидейко inspirierte jedoch meine endgültige Lösung.

Zuerst habe ich das folgende benutzerdefinierte BottomSheetBehavior erstellt. Es überschreibt alle Berührungsmethoden und gibt false zurück (oder hat nichts getan), wenn es gesperrt ist. Andernfalls verhält es sich wie ein normales BottomSheetBehavior. Dies deaktiviert die Fähigkeit des Benutzers, nach unten zu ziehen, und hat keine Auswirkungen auf die Änderung des Status im Code.

LockableBottomSheetBehavior.java

public class LockableBottomSheetBehavior<V extends View> extends BottomSheetBehavior<V> {

    private boolean mLocked = false;

    public LockableBottomSheetBehavior() {}

    public LockableBottomSheetBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setLocked(boolean locked) {
        mLocked = locked;
    }

    @Override
    public boolean onInterceptTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) {
        boolean handled = false;

        if (!mLocked) {
            handled = super.onInterceptTouchEvent(parent, child, event);
        }

        return handled;
    }

    @Override
    public boolean onTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) {
        boolean handled = false;

        if (!mLocked) {
            handled = super.onTouchEvent(parent, child, event);
        }

        return handled;
    }

    @Override
    public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, V child, View directTargetChild, View target, int nestedScrollAxes) {
        boolean handled = false;

        if (!mLocked) {
            handled = super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes);
        }

        return handled;
    }

    @Override
    public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, V child, View target, int dx, int dy, int[] consumed) {
        if (!mLocked) {
            super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed);
        }
    }

    @Override
    public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, V child, View target) {
        if (!mLocked) {
            super.onStopNestedScroll(coordinatorLayout, child, target);
        }
    }

    @Override
    public boolean onNestedPreFling(CoordinatorLayout coordinatorLayout, V child, View target, float velocityX, float velocityY) {
        boolean handled = false;

        if (!mLocked) {
            handled = super.onNestedPreFling(coordinatorLayout, child, target, velocityX, velocityY);
        }

        return handled;

    }
}

Hier ist ein Beispiel für die Verwendung. In meinem Fall brauchte ich es, damit das untere Blatt beim Erweitern verriegelt wurde.

activity_home.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <android.support.design.widget.CollapsingToolbarLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_scrollFlags="scroll|snap"
            app:titleEnabled="false"/>
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"/>
    </android.support.design.widget.AppBarLayout>

    <!-- Use layout_behavior to set your Behavior-->
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layoutManager="android.support.v7.widget.LinearLayoutManager"
        app:layout_behavior="com.myapppackage.LockableBottomSheetBehavior"/>

</android.support.design.widget.CoordinatorLayout>

HomeActivity.java

public class HomeActivity extends AppCompatActivity {
    BottomSheetBehavior mBottomSheetBehavior;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
        recyclerView.setAdapter(new SomeAdapter());

        mBottomSheetBehavior = BottomSheetBehavior.from(recyclerView);
        mBottomSheetBehavior.setBottomSheetCallback(new MyBottomSheetCallback());
    }

    class MyBottomSheetCallback extends BottomSheetBehavior.BottomSheetCallback() {
        @Override
        public void onStateChanged(@NonNull View bottomSheet, int newState) {
            if (newState == BottomSheetBehavior.STATE_EXPANDED) {
                if (mBottomSheetBehavior instanceof LockableBottomSheetBehavior) {
                    ((LockableBottomSheetBehavior) mBottomSheetBehavior).setLocked(true);
                }
            }
        }

        @Override
        public void onSlide(@NonNull View bottomSheet, float slideOffset) {}
    });
}

Hoffe, das hilft, viel Verwirrung zu beseitigen!

James Davis
quelle
1
Schön, es ist die beste Antwort, dass wir eine Umgehung dieser Zustände vermeiden können, die dazu führen, dass Ereignisse verpasst werden. Danke dir.
Tấn Nguyên
@ James - Schöne Antwort, aber jetzt kann ich PeekHeight () nicht setzen. Irgendeine Idee?
Adarsh ​​Yadav
Ich habe es versucht. Für mich geht das. Danke Bruder für die Rettung meines
Arsches
1
Dies ist eine gute Problemumgehung, obwohl sie bis heute nicht aktualisiert wird. OnNestedPreScroll und bestimmte andere Methoden sind veraltet. Müssen diese Methoden aktualisieren und es funktioniert gut.
Ajay
4
Hallo, es funktioniert nicht auf einem BottomSheetDialogFragment, ich kann immer noch das Bottomsheet ziehen
-do
23

Am Ende habe ich eine Problemumgehung geschrieben, um diesen Anwendungsfall des dynamischen Deaktivierens des Benutzer-Ziehens zu beheben, wobei BottomSheetBehavior in eine Unterklasse unterteilt wird, um onInterceptTouchEvent zu überschreiben und zu ignorieren, wenn ein benutzerdefiniertes Flag (in diesem Fall mAllowUserDragging) auf false gesetzt ist:

import android.content.Context;
import android.support.design.widget.BottomSheetBehavior;
import android.support.design.widget.CoordinatorLayout;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class WABottomSheetBehavior<V extends View> extends BottomSheetBehavior<V> {
    private boolean mAllowUserDragging = true;
    /**
     * Default constructor for instantiating BottomSheetBehaviors.
     */
    public WABottomSheetBehavior() {
        super();
    }

    /**
     * Default constructor for inflating BottomSheetBehaviors from layout.
     *
     * @param context The {@link Context}.
     * @param attrs   The {@link AttributeSet}.
     */
    public WABottomSheetBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setAllowUserDragging(boolean allowUserDragging) {
        mAllowUserDragging = allowUserDragging;
    }

    @Override
    public boolean onInterceptTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) {
        if (!mAllowUserDragging) {
            return false;
        }
        return super.onInterceptTouchEvent(parent, child, event);
    }
}

Und in Ihrem Layout xml:

    <FrameLayout
        android:id="@+id/bottom_sheet_frag_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:behavior_hideable="true"
        app:behavior_peekHeight="@dimen/bottom_sheet_peek_height"
        app:elevation="@dimen/bottom_sheet_elevation"
        app:layout_behavior="com.example.ray.WABottomSheetBehavior" />

Bisher ist dies die beständigste Lösung, um das Ziehen von Benutzern auf dem unteren Blatt bei Bedarf zu deaktivieren.

Alle anderen Lösungen, die darauf beruhten, einen weiteren setState-Aufruf im onStateChanged-Rückruf auszulösen, führten dazu, dass das BottomSheet in einen schlechten Zustand geriet oder erhebliche UX-Probleme verursachte (im Fall des Versendens des setState-Aufrufs in einer ausführbaren Datei).

Hoffe das hilft jemandem :)

Strahl

Ray W.
quelle
4
Das ist ziemlich ordentlich
Odys
3
@BeeingJk Verwenden Sie anstelle des FrameLayout NestedScrollView und setzen SiebottomSheetFragContainer.setNestedScrollingEnabled(false);
AfzalivE
1
Gelöst: durch Setzen des Rückrufs CoordinatorLayout.Behavior behaviour = layoutParams.getBehavior (); if (Verhalten! = null && Verhaltensinstanz von BottomSheetBehavior) {((BottomSheetBehavior) Verhalten) .setBottomSheetCallback (mBottomSheetBehaviorCallback); }
LOG_TAG
3
Das ist kein Wok für mich! PS: Ich habe einen scrollbaren Text im unteren Blatt
Thorvald Olavsen
6
Wie gießt du es während der Initialisierung? Dies gibt mir eine Warnung WABottomSheetBehavior <View> behaviour = (WABottomSheetBehavior) BottomSheetBehavior.from (sheetView);
Leo Droidcoder
8

Späte Antwort, aber das hat bei mir funktioniert, was ein bisschen anders ist als das, was andere vorgeschlagen haben.

Sie könnten versuchen, die cancelableEigenschaft auf false zu setzen, d. H.

setCancelable(false);

und dann manuell die Ereignisse behandeln, bei denen Sie den Dialog in der setupDialogMethode schließen möchten .

@Override
public void setupDialog(final Dialog dialog, final int style) {

    // handle back button
    dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
        @Override
        public boolean onKey(final DialogInterface dialog, final int keyCode, final KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                dialog.dismiss();
            }
            return true;
        }
    });

    // handle touching outside of the dialog
    final View touchOutsideView = getDialog().getWindow().getDecorView().findViewById(android.support.design.R.id.touch_outside);
    touchOutsideView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(final View view) {
            dialog.dismiss();
        }
    });
}

Dies funktioniert mit einer ListView innerhalb des Dialogfragments, in der ich mich ein wenig mit anderen Lösungen beschäftigt habe.

chrisw
quelle
Schöne prägnante Lösung. Wenn Sie dies lesen, möchten Sie (wahrscheinlich) zusätzliche Überprüfungen für event.isCanceled()und event.getAction() == MotionEvent.ACTION_UPvor dem Schließen des Dialogfelds. Dadurch wird verhindert, dass Fehlklicks die Entlassung auslösen.
Eric Bachhuber
Danke dafür. Dies ist die einfachste Lösung zum Deaktivieren des Ziehens.
AVJ
7

Die akzeptierte Antwort funktioniert nicht auf dem ersten Testgerät, das ich verwende. Und der Rückprall ist nicht glatt. Es scheint besser, den Status erst auf STATE_EXPANDED zu setzen, nachdem ein Benutzer das Ziehen freigegeben hat. Folgendes ist meine Version:

    final BottomSheetBehavior behavior = BottomSheetBehavior.from(findViewById(R.id.bottomSheet));
    behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
        @Override
        public void onStateChanged(@NonNull View bottomSheet, int newState) {
            if (newState > BottomSheetBehavior.STATE_DRAGGING)
                bottomSheet.post(new Runnable() {
                    @Override public void run() {
                        behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
                    }
                });
        }

        @Override
        public void onSlide(@NonNull View bottomSheet, float slideOffset) {
        }
    });
Mingfai
quelle
1
Lassen Sie mich Ihnen das Problem erklären, es in einen Runnable zu werfen, es sei denn, Sie möchten dies. Sie können es nicht mit einer Schaltfläche schließen, da es zum Schließen gezogen werden muss. Und es wird immer auf das Ziehen reagieren, nur dass es den Benutzer daran hindern würde, zu ziehen, um zu entlassen
Abubakar Oladeji
7

Fügen Sie diesen Code dem BottomSheetBehavior- Objekt hinzu. Das Ziehen wird deaktiviert. Funktioniert gut für mich.

final BottomSheetBehavior behavior = BottomSheetBehavior.from((View) view.getParent());
    behavior.setHideable(false);
    behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {

      @Override
      public void onStateChanged(@NonNull View bottomSheet, int newState) {
        if (newState == BottomSheetBehavior.STATE_DRAGGING) {
          behavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
        }

      }
      @Override
      public void onSlide(@NonNull View bottomSheet, float slideOffset) {

      }
});
Kaushik R.
quelle
1
Dadurch wird das Wischen nicht deaktiviert. Das untere Blatt wird vollständig zusammengeklappt.
Adam Hurwitz
7

Erwartetes Verhalten:

  • BottomSheet wird beim Ziehen nicht geschlossen
  • BottomSheet wird geschlossen, wenn es außerhalb des Dialogfensters berührt wird

Code:

class MyBottomSheet : BottomSheetDialogFragment () {

   override fun onActivityCreated(savedInstanceState: Bundle?) {
       super.onActivityCreated(savedInstanceState)
       disableBottomSheetDraggableBehavior()
   }

   private fun disableBottomSheetDraggableBehavior() {
      this.isCancelable = false
      this.dialog?.setCanceledOnTouchOutside(true)
   }

 }
Alif
quelle
Aus irgendeinem Grund kann ich den Dialog, der sich außerhalb berührt, nicht schließen, aber es funktioniert, um das Ziehen zu deaktivieren
Gastón Saillén
5

Um das BottomSheet zu sperren und zu vermeiden, dass der Benutzer es herauswischt, habe ich Folgendes getan

public void showBottomSheet() {
    bsb.setHideable(false);
    bsb.setState(BottomSheetBehavior.STATE_EXPANDED);
}

public void hideBottomSheet() {
    bsb.setHideable(true);
    bsb.setState(BottomSheetBehavior.STATE_COLLAPSED);
}

Es funktioniert ganz gut für mich.

Diego Ramírez Vásquez
quelle
Diese Lösung war ansprechend, führt jedoch auf bizarre Weise dazu, dass das untere Blatt oben auf dem Bildschirm und nicht unten angezeigt wird! Es verschwindet jedoch auf normale Weise. Es ist sehr Star Trek.
Tunga
Ich musste eine Änderung des Sehvermögens vornehmen und stattdessen verwenden BottomSheetBehavior.STATE_HIDDEN. In diesem Fall dürfen Sie auch nicht anrufen setPeekHeight(). Dies ist hier viel weniger kompliziert als bei anderen Lösungen.
HolySamosa
4

Der einfache Weg, das Ziehen zu sperren, ist setPeekHeight, das der Ansichtshöhe entspricht. Beispielsweise:

private LinearLayout bottomSheet;
private BottomSheetBehavior bottomBehavior;

@Override
public void onResume() {
    super.onResume();
    bottomBehavior = BottomSheetBehavior.from((bottomSheet);
    bottomBehavior.setPeekHeight(bottomSheet.getHeight());
    bottomBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
}
Sergei K.
quelle
4

Ein Beispiel mit BottomSheetDialogFragment. Es funktioniert perfekt.

Bearbeiten 09/04/2020: Ersetzt abgeschrieben setBottomSheetCallback()durchaddBottomSheetCallback()

class FragMenuBDrawer : BottomSheetDialogFragment() {

    ...

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog

        dialog.setOnShowListener {
            val bottomSheet = (it as BottomSheetDialog).findViewById<View>(com.google.android.material.R.id.design_bottom_sheet) as FrameLayout?
            val behavior = BottomSheetBehavior.from(bottomSheet!!)
            behavior.state = BottomSheetBehavior.STATE_EXPANDED

            behavior.addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() {
                override fun onStateChanged(bottomSheet: View, newState: Int) {
                    if (newState == BottomSheetBehavior.STATE_DRAGGING) {
                        behavior.state = BottomSheetBehavior.STATE_EXPANDED
                    }
                }

                override fun onSlide(bottomSheet: View, slideOffset: Float) {}
            })
        }

        // Do something with your dialog like setContentView() or whatever
        return dialog
    }

    ...
}
Sattar Hummatli
quelle
3

Sie müssen nicht alle Ereignisse blockieren, wenn das untere Blatt deaktiviert ist. Sie können nur das Ereignis ACTION_MOVE blockieren. Verwenden Sie deshalb ein benutzerdefiniertes Verhalten für das untere Blatt

public class BottomSheetBehaviorWithDisabledState<V extends View> extends BottomSheetBehavior<V> {
    private boolean enable = true;

    /**
     * Default constructor for instantiating BottomSheetBehaviors.
     */
    public BottomSheetBehaviorWithDisabledState() {
        super();
    }

    /**
     * Default constructor for inflating BottomSheetBehaviors from layout.
     *
     * @param context The {@link Context}.
     * @param attrs   The {@link AttributeSet}.
     */
    public BottomSheetBehaviorWithDisabledState(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setEnable(boolean enable){
        this.enable = enable;
    }

    @Override
    public boolean onInterceptTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) {
        if (!enable && event.getAction() == MotionEvent.ACTION_MOVE){
            return false;
        }
        return super.onInterceptTouchEvent(parent, child, event);
    }
}
Ilya
quelle
Wie benutzt du diese Klasse? Ich erhalte eine IllegalArgumentException: Die Ansicht ist nicht mit
BottomSheetBehavior verknüpft
3

Hier ist eine funktionierende Version der Top-Lösung in Kotlin:

import android.support.design.widget.BottomSheetBehavior
import android.support.design.widget.CoordinatorLayout
import android.view.MotionEvent
import android.view.View

class CustomBottomSheetBehavior<V : View> : BottomSheetBehavior<V>() {

    @Suppress("UNCHECKED_CAST")
    companion object {
        fun <V : View> from(view: V): CustomBottomSheetBehavior<V> {
            val params = view.layoutParams as? CoordinatorLayout.LayoutParams ?:
                throw IllegalArgumentException("The view is not a child of CoordinatorLayout")
                params.behavior as? BottomSheetBehavior<V> ?:
                    throw IllegalArgumentException("The view is not associated with BottomSheetBehavior")
                params.behavior = CustomBottomSheetBehavior<V>()
            return params.behavior as CustomBottomSheetBehavior<V>
        }
    }

    override fun onInterceptTouchEvent(parent: CoordinatorLayout, child: V, event: MotionEvent): Boolean {
        return false
    }

    override fun onTouchEvent(parent: CoordinatorLayout, child: V, event: MotionEvent): Boolean {
        return false
    }

    override fun onStartNestedScroll(coordinatorLayout: CoordinatorLayout, child: V, directTargetChild: View, target: View, axes: Int, type: Int): Boolean {
        return false
    }

    override fun onNestedPreScroll(coordinatorLayout: CoordinatorLayout, child: V, target: View, dx: Int, dy: Int, consumed: IntArray, type: Int) {}

    override fun onStopNestedScroll(coordinatorLayout: CoordinatorLayout, child: V, target: View, type: Int) {}

    override fun onNestedPreFling(coordinatorLayout: CoordinatorLayout, child: V, target: View, velocityX: Float, velocityY: Float): Boolean {
        return false
    }
}

Wann immer Sie möchten:

val bottomSheetBehavior by lazy {
    CustomBottomSheetBehavior.from(bottom_sheet_main)
}

Das bottom_sheet_mainist die aktuelle Ansicht mit Kotlin Android Erweiterungen .

Rodrigo Queiroz
quelle
3

Setzen Sie bottomSheet onClickListener auf null.

bottomSheet.setOnClickListener(null);

Diese Zeile deaktiviert alle Aktionen nur für bottomSheet und wirkt sich nicht auf die innere Ansicht aus.

Hashem Jahangiri
quelle
1
Dies führt zu unerwarteten Animationen, wenn das untere Blatt zu schließen versucht.
Adam Hurwitz
3
implementation 'com.google.android.material:material:1.2.0-alpha05'

Sie können das Ziehen des BottomSheets wie folgt deaktivieren.

import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_EXPANDED

//another code

this.bottomSheetBehavior = BottomSheetBehavior.from(view)
this.bottomSheetBehavior.state = STATE_EXPANDED
this.bottomSheetBehavior.isDraggable = false // disable dragging

//another code
this.bottomSheetbehavior.isDraggable = true //draggable

(Kotlin), ich hoffe, diese Antwort kann Ihr Problem lösen.

lgb
quelle
1
Diese Alpha-Version verhält sich verrückt. Ich empfehle nicht :(
Adam Styrc
2

Ich habe eine erstaunliche Lösung gefunden. Das anfängliche Problem war, dass bottomSheet in den Status HIDDEN überging und dann nicht mehr in bottomSheetDialog.show () angezeigt wurde. Aber ich wollte den Dialog auf der show () -Methode sichtbar machen und dem Benutzer ermöglichen, ihn nach unten zu wischen, damit er sich wie ein unteres Blatt anfühlt. Unten ist was ich getan habe ..

    BottomSheetDialog itemTypeDialog = new BottomSheetDialog(this);
    View bottomSheetView = getLayoutInflater().inflate(R.layout.dialog_bottomsheet, null);
    itemTypeDialog.setContentView(bottomSheetView);
    BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from((View) bottomSheetView.getParent());
    bottomSheetBehavior.setBottomSheetCallback(bottomSheetCallback); // You can also attach the listener here itself.

    BottomSheetBehavior.BottomSheetCallback bottomSheetCallback =  new BottomSheetBehavior.BottomSheetCallback() {
    @Override
    public void onStateChanged(@NonNull View bottomSheet, int newState) {
        Log.d(TAG, "BottomSheetCallback: " + newState);
        if (newState == BottomSheetBehavior.STATE_HIDDEN) {
            bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
            itemTypeDialog.dismiss();
        } 
    }

    @Override
    public void onSlide(@NonNull View bottomSheet, float slideOffset) {

    }
};
Deepesh
quelle
Dies ist eine perfekte Antwort
Vivek Kumar Srivastava
2
  1. Kopieren Sie BottomSheetDialogin Ihr Projekt und benennen Sie es in umMyBottomSheetDialog
  2. hinzufügen getBottomSheetBehaviorzuMyBottomSheetDialog
  3. Verwenden Sie MyBottomSheetDialogstattdessenBottomSheetDialog
  4. bottomSheetBehavior.setBottomSheetCallback

Code wie dieser

public class MyBottomSheetDialog extends AppCompatDialog {

    // some code

    public BottomSheetBehavior<FrameLayout> getBottomSheetBehavior() {
        return mBehavior;
    }

    // more code

in Ihrem Code

    final BottomSheetBehavior<FrameLayout> bottomSheetBehavior = myBottomSheetDialog.getBottomSheetBehavior();
    bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
        @Override
        public void onStateChanged(@NonNull View bottomSheet, int newState) {
            if (newState == BottomSheetBehavior.STATE_DRAGGING) {
                bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
            }
        }

        @Override
        public void onSlide(@NonNull View bottomSheet, float slideOffset) {

        }
aotian16
quelle
2

Dies ist im Grunde die Kotlin-Version der richtigen Antwort oben:

    class LockedBottomSheetBehavior<V : View>(context: Context, attrs: AttributeSet) :
        BottomSheetBehavior<V>(context, attrs) {

    companion object {
        fun <V : View> from(view: V): LockedBottomSheetBehavior<*> {
            val params = view.layoutParams as? CoordinatorLayout.LayoutParams
                    ?: throw IllegalArgumentException("The view is not a child of CoordinatorLayout")
            return params.behavior as? LockedBottomSheetBehavior<*>
                    ?: throw IllegalArgumentException(
                            "The view is not associated with BottomSheetBehavior")
        }
    }

    override fun onInterceptTouchEvent(
            parent: CoordinatorLayout,
            child: V, event: MotionEvent
    ) = false

    override fun onTouchEvent(
            parent: CoordinatorLayout,
            child: V,
            event: MotionEvent
    ) = false

    override fun onStartNestedScroll(
            coordinatorLayout: CoordinatorLayout,
            child: V,
            directTargetChild: View,
            target: View,
            axes: Int,
            type: Int) = false

    override fun onNestedPreScroll(
            coordinatorLayout: CoordinatorLayout,
            child: V,
            target: View,
            dx: Int,
            dy: Int,
            consumed: IntArray,
            type: Int) {
    }

    override fun onStopNestedScroll(
            coordinatorLayout: CoordinatorLayout,
            child: V,
            target: View,
            type: Int) {
    }

    override fun onNestedPreFling(
            coordinatorLayout: CoordinatorLayout,
            child: V,
            target: View,
            velocityX: Float,
            velocityY: Float
    ) = false
}
Jamal
quelle
Wie benutzt du diese Klasse? Ich erhalte eine IllegalArgumentException: Die Ansicht ist nicht mit
BottomSheetBehavior verknüpft
1
app: layout_behavior = "UserLockBottomSheetBehavior"> in XML und dann im Code gehen Sie wie folgt vor. // die untere Blattansicht abrufen LinearLayout llBottomSheet = (LinearLayout) findViewById (R.id.bottom_sheet); // Initiiere das Verhalten des unteren Blattes BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from (llBottomSheet);
Jamal
1

Versuche dies.

1) Erstellen Sie das untere Blatt und deklarieren Sie die Variable in Ihrer Java-Klasse wie

private BottomSheetBehavior sheetBehavior;

2) sheetBehavior = BottomSheetBehavior.from(bottomSheet);

3) Fügen Sie in der Rückruffunktion des unteren Blattes die folgenden Zeilen hinzu.

sheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
            @Override
            public void onStateChanged(@NonNull View bottomSheet, int newState) {
                switch (newState) {
                    case BottomSheetBehavior.STATE_HIDDEN:
                        Log.d(TAG, "--------------  STATE_HIDDEN");
                        break;
                    case BottomSheetBehavior.STATE_EXPANDED: {
                        Log.d(TAG, "--------------  STATE_EXPANDED");
                    }
                    break;
                    case BottomSheetBehavior.STATE_COLLAPSED: {
                        Log.d(TAG, "--------------  STATE_COLLAPSED");
                    }
                    break;
                    case BottomSheetBehavior.STATE_DRAGGING:
                        sheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
                        break;
                    case BottomSheetBehavior.STATE_SETTLING:
                        Log.d(TAG, "--------------  STATE_SETTLING");
                        break;
                }
            }

            @Override
            public void onSlide(@NonNull View bottomSheet, float slideOffset) {

            }
        });
Surendar D.
quelle
1

Zuerst möchte ich mich nur bei allen bedanken, die versucht haben, eine Antwort zu geben. Ich schreibe nur diese Antwort, indem ich dieses Problem so löse, wie ich will. Ich werde Schritt für Schritt beschreiben, wie ich das mache, indem ich von hier aus Hilfe nehme.

Visualisierung: Nach dem Klicken auf die Schaltfläche sehen Show BottomSheetSie den zweiten Bildschirm . Jetzt werden Sie sehen, dass BottomSheet nur zum Ziehen gesperrt ist . Aber wenn Sie auf die Schaltfläche Länderliste der BottomSheet wird verstecken. Dies war die Beschreibung, die wir jetzt in den Code einarbeiten.

  • Fügen Sie zunächst die Designunterstützungsbibliothek zu Ihrer build.gradle- Datei hinzu:

    Implementierung 'com.android.support:design:28.0.0'

  • UserLockBottomSheetBehavior.java : Bildnachweis : James Davis (Thanks Man)

public class UserLockBottomSheetBehavior<V extends View> extends BottomSheetBehavior<V> {

    public UserLockBottomSheetBehavior() {
        super();
    }

    public UserLockBottomSheetBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onInterceptTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) {
        return false;
    }

    @Override
    public boolean onTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) {
        return false;
    }

    @Override
    public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, V child, View directTargetChild, View target, int nestedScrollAxes) {
        return false;
    }

    @Override
    public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, V child, View target, int dx, int dy, int[] consumed) {
    }

    @Override
    public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, V child, View target) {
    }

    @Override
    public boolean onNestedPreFling(CoordinatorLayout coordinatorLayout, V child, View target, float velocityX, float velocityY) {
        return false;
    }

}
  • bottomomsheet.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/bottomSheet"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_vertical"
    android:orientation="vertical"
    app:behavior_hideable="true"
    app:layout_behavior="com.samsolution.custombottomsheet.UserLockBottomSheetBehavior">

 <RelativeLayout
     android:id="@+id/minimizeLayout"
     android:background="@color/colorPrimary"
     android:layout_width="match_parent"
     android:layout_height="?android:attr/actionBarSize">

     <TextView
         android:layout_centerHorizontal="true"
         android:padding="16dp"
         android:layout_width="wrap_content"
         android:layout_height="?android:attr/actionBarSize"
         android:gravity="center_horizontal|center"
         android:text="Country List"
         android:textColor="#FFFFFF"
         android:textStyle="bold" />
 </RelativeLayout>

    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ListView
            android:id="@+id/homeCountryList"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </android.support.v7.widget.CardView>

</LinearLayout>
  • activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFF"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_gravity="center"
        android:onClick="showCountryListFromBottomSheet">

        <Button
            android:layout_gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@android:color/holo_red_light"
            android:onClick="showCountryListFromBottomSheet"
            android:padding="16dp"
            android:text="Show BottomSheet"
            android:textAllCaps="false"
            android:textColor="#ffffff" />

    </LinearLayout>

    <include layout="@layout/bootomsheet" />

</android.support.design.widget.CoordinatorLayout>
  • MainActivity.java
public class MainActivity extends AppCompatActivity {

    private BottomSheetBehavior<LinearLayout> bottomSheetBehavior;                                  // BottomSheet Instance
    LinearLayout bottomsheetlayout;
    String[] list = {"A", "B", "C", "D", "A", "B", "C", "D","A", "B", "C", "D","A", "B", "C", "D","A", "B", "C", "D"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        bottomsheetlayout = findViewById(R.id.bottomSheet);
        bottomSheetBehavior = BottomSheetBehavior.from(bottomsheetlayout);

        ListView listView = findViewById(R.id.homeCountryList);
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,list);
        listView.setAdapter(adapter);

        bottomSheetHide();                                                                          //BottomSheet get hide first time

        RelativeLayout minimizeLayoutIV;                                                            // It will hide the bottomSheet Layout
        minimizeLayoutIV = findViewById(R.id.minimizeLayout);
        minimizeLayoutIV.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               bottomSheetHide();
            }
        });
    }

    public void showCountryListFromBottomSheet(View view) {
        bottomSheetBehavior.setHideable(false);
        bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
    }

    public void bottomSheetHide(){
        bottomSheetBehavior.setHideable(true);
        bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
    }
}

Erster Bildschirm Zweiter Bildschirm

Shahadat Hossain
quelle
1

Die Lösung aus der akzeptierten Antwort hat meistens für mich funktioniert, aber mit einem Problem: Ansichten, die sich hinter der Ansicht des unteren Blattes befinden, reagierten auf Berührungsereignisse, wenn ein Berührungsereignis im Bereich des unteren Blattes auftritt, der frei von untergeordneten Ansichten ist. Mit anderen Worten, wie Sie im Bild unten sehen können, reagiert die Karte darauf, wenn der Benutzer den Finger in das untere Blatt schiebt.

Berührungsbereich des unteren Blattes

Um das Problem zu beheben, habe ich die onInterceptTouchEventMethode durch Festlegen touchListenerin der unteren Blattansicht geändert (der Rest des Codes bleibt derselbe wie in der akzeptierten Lösung).

override fun onInterceptTouchEvent(
        parent: CoordinatorLayout,
        child: V, event: MotionEvent
    ): Boolean {
        child.setOnTouchListener { v, event ->
            true
        }
        return false
    }
Myroslav Kolodii
quelle
1

Mit 'com.google.android.material:material:1.2.0-alpha06'

Funktioniert hervorragend mit NestedScrollViewundRecyclerView

Beispielcode:

    LinearLayout contentLayout = findViewById(R.id.contentLayout);
    sheetBehavior = BottomSheetBehavior.from(contentLayout);
    sheetBehavior.setDraggable(false);
F. MySir
quelle
0

Das Anpassen des peakHeightWertes hat bei mir funktioniert.

Ich stelle die Peakhöhe als Höhe des Bodenblatts ein, wenn es erweitert wird.

    private val bottomSheetCallback = object : BottomSheetBehavior.BottomSheetCallback() {
    override fun onSlide(bottomSheet: View, slideOffset: Float) {

    }

    override fun onStateChanged(bottomSheet: View, newState: Int) {
        if (newState == BottomSheetBehavior.STATE_EXPANDED)
            bottomSheetBehavior.peekHeight = bottomSheet.height
    }
}
pz64_
quelle
1
Dies ist nicht ideal, da dies zu unerwarteten Animationen führen kann.
Adam Hurwitz
In meinem Fall. Es gab überhaupt keine Animationsprobleme. Es bewegt sich einfach nicht, nachdem die Karte erweitert wurde. Es ist nicht ideal, aber es hat wie erwartet funktioniert!
pz64_
Interessant, das könnte der Fall sein. Ich habe das Problem mit dem unerwarteten Schließen meines unteren Blattes behoben, indem ich die Symbolleiste des CollapsingToolbarLayout auf "Unsichtbar" oder "Gone" gesetzt habe, wenn das untere Blatt geöffnet ist. Eine Berührungsinteraktion in Bezug auf die Symbolleiste, obwohl sie sich darunter befand, führte dazu, dass das untere Blatt unerwartet geschlossen wurde. Das Problem ist jetzt behoben.
Adam Hurwitz
0
    LayoutInflater inflater = LayoutInflater.from(context);
            View view = inflater.inflate(R.layout.bottomsheet_view_profile_image, null);
            BottomSheetDialog dialog = new BottomSheetDialog(context);
            dialog.setContentView(view);
            dialog.setCancelable(false);


            BottomSheetBehavior behavior = BottomSheetBehavior
                    .from(((View) view.getParent()));
            behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
                @Override
                public void onStateChanged(@NonNull View bottomSheet, int newState) {
                    if (newState == BottomSheetBehavior.STATE_DRAGGING) {
                        behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
                    }
                }

                @Override
                public void onSlide(@NonNull View bottomSheet, float slideOffset) {
                }
            });
            behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
            behavior.setSkipCollapsed(true);
            dialog.show();
SRBhagwat
quelle
0

Dies ist das erste Ergebnis in Google. Ich glaube, es ist nur fair, die einfache Lösung hier einzutragen:

   private fun disableDragToDismiss() {
    if (dialog is BottomSheetDialog) {
        val bsDialog = dialog as BottomSheetDialog
        bsDialog.behavior.isHideable = false
    } else {
        Log.d(TAG, " BottomSheetDialog with dialog that is not BottomSheetDialog")
    }
}

und dann rufen Sie es einfach onCreateView()in der BottomSheetDialogFragmentImplementierung auf

Josef
quelle
0

Ich habe das gleiche Problem in BottomSheetDialogFragmentund wende viele Lösungen mit dem behaviorvon an, dialogaber keines davon löst mein Problem und dann habe ich es gelöst, aber setCancelable(false);zum Zeitpunkt der Initialisierung von eingestellt dialog.

DialogEndRide dialogCompleteRide = new DialogEndRide();
dialogCompleteRide.setCancelable(false);
dialogCompleteRide.show(getChildFragmentManager(), "");

Dadurch wird die Geste deaktiviert BottomSheetDialogFragmentund Sie können sie dialogmithilfe der dismiss();Funktion programmgesteuert schließen .

rana_sadam
quelle
-1

Ich hatte das gleiche Problem, ich habe dies durch Code gelöst. Der Benutzer kann kein Bottomheet ziehen. Sie müssen den Status programmgesteuert behandeln.

 mBottomSheetBehavior.isDraggable = false
Pritesh Vishwakarma
quelle
-2

Verwenden Sie einfach: bottomSheet.dismissOnDraggingDownSheet = false

Von der Material.io-Website kopiert:

let viewController: ViewController = ViewController() let bottomSheet: MDCBottomSheetController = MDCBottomSheetController(contentViewController: viewController)

// **** Diese Zeile verhindert das Entlassen durch Ziehen von bottomSheet ****

bottomSheet.dismissOnDraggingDownSheet = false

present(bottomSheet, animated: true, completion: nil)

Henry Tokin
quelle
Es ist für iOS hier nicht Android
Back Packer