Tắt tính năng kéo người dùng trên BottomSheet


99

Tôi đang cố vô hiệu hóa tính năng kéo người dùng BottomSheet. Lý do tôi muốn vô hiệu hóa là hai điều. 1. Nó ngăn không cho ListViewcuộn xuống, 2. Tôi không muốn người dùng loại bỏ việc sử dụng kéo nhưng với một nút trên BottomSheetView. Đây là những gì tôi đã làm

 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>


Vui lòng kiểm tra câu trả lời của tôi. Tôi có thông báo rằng nó là thích hợp hơn câu trả lời chấp nhận
Vitalii Obideiko

Câu trả lời:


92

Bây giờ nó có thể không còn phù hợp nữa, nhưng tôi sẽ để nó ở đây:

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

Và sử dụng nó trong tệp xml của bạn:

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

Nó vô hiệu hóa tất cả các hành động của người dùng, nó có thể được sử dụng khi bạn muốn kiểm soát BottomSheet chỉ theo chương trình.


2
Đây là câu trả lời tốt nhất để tắt BottomSheetBehaviour. Một người đàn ông ở trên cũng đã đăng giải pháp tương tự, nhưng anh ta không viết để ghi đè lên sự kiện khác như onTouchEvent () . Mặt khác bạn có thể cải thiện câu trả lời của bạn nếu bạn đặt một lá cờ thay vì sai
murt

3
Làm cách nào để bạn sử dụng điều này với BottomSheetFragment?
user3144836

7
Bạn cần tham chiếu cụ thể đến lớp này trong XML của mình. ứng dụng: layout_behavior = "com.my.package.UserLockBottomSheetBehavior"
Steve

3
Trong một số trường hợp, điều này vẫn không hoạt động, nếu chúng ta có một danh sách trong mảnh tấm đáy, nó vẫn kéo
Deepak Joshi

1
@DeepakJoshi lẽ u có thể kéo dài của RecyclerView và ghi đè vài phương pháp như 'hasNestedScrollingParent', nhưng tôi không chắc chắn
Vitalii Obideiko

74

kiểm tra trạng thái trong onStateChangedphương pháp setBottomSheetCallbacknếu trạng thái là BottomSheetBehavior.STATE_DRAGGINGsau đó thay đổi nó BottomSheetBehavior.STATE_EXPANDEDtheo cách này bạn có thể dừng lại STATE_DRAGGINGbởi người dùng. như bên dưới

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

sử dụng nút để mở trang dưới cùng như dưới đây

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

không sử dụng setPeekHeighthoặcapp:behavior_peekHeight

bằng cách trên, bạn có thể đạt được mục tiêu của mình


1
Bí quyết đẹp. Không nhận thấy điều đó. Cảm ơn. Và ngoài ra, bạn có thể giúp với điều này. Khi tôi yêu cầu nó mở rộng lúc đầu, nó trong suốt và tôi có thể nhìn thấy khung cảnh phía sau, nhưng tôi không thể tương tác cho đến khi tôi nhấn vào EditText trong SheetView trước khi hiển thị nó.
Abubakar Oladeji

Tôi đã thực hiện của tôi BottomSheet View match_parentvà bất cứ khi nào tôi cố gắng đưa nó lên trong tôi Activity, tôi nhận thấy nó trượt lên, nhưng nó không nhìn thấy được không cho đến khi tôi khai thác EditTexttrong đó mà sẽ làm xuất hiện Keyboardvà làm cho BottomSheet Viewcó thể nhìn thấy
Abubakar Oladeji

1
Tôi đã thử điều này, nhưng các tiểu bang kết thúc STATE_SETTLING. Tôi có một nút để mở và đóng trang tính dưới cùng, nếu nó là HIDDEN, tôi mở rộng nó. Nếu nó được MỞ RỘNG, tôi ẩn nó. Vì nó bị kẹt trong CÀI ĐẶT, nút của tôi không hoạt động sau khi kéo trang tính dưới cùng. Bất kỳ ý tưởng về điều đó?
Gokhan Arik

3
Giải pháp này là không đáng tin cậy; trang dưới cùng chuyển sang trạng thái xấu, như Gokhan đã nói ... và khi ở trạng thái xấu đó, các lệnh gọi như tải một đoạn mới vào trang dưới cùng sẽ đơn giản là trống.
Ray W

7
Nó sẽ không hoạt động nếu bạn có chế độ xem danh sách lồng nhau bên trong trang dưới cùng
Rishabh Chandel

32

Được rồi, vì vậy câu trả lời được chấp nhận không phù hợp với tôi. Tuy nhiên, câu trả lời của Виталий Обидейко đã truyền cảm hứng cho giải pháp cuối cùng của tôi.

Đầu tiên, tôi đã tạo BottomSheetBehavior tùy chỉnh sau. Nó ghi đè tất cả các phương thức liên quan đến chạm và trả về false (hoặc không làm gì cả) nếu nó bị khóa. Nếu không, nó hoạt động giống như một BottomSheetBehavior bình thường. Điều này vô hiệu hóa khả năng kéo xuống của người dùng và không ảnh hưởng đến việc thay đổi trạng thái trong mã.

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;

    }
}

Đây là một ví dụ về cách sử dụng nó. Trong trường hợp của tôi, tôi cần nó để Trang dưới cùng bị khóa khi mở rộng.

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

Hy vọng điều này sẽ giúp làm sáng tỏ rất nhiều sự nhầm lẫn!


1
Thật tuyệt, câu trả lời tốt nhất là chúng ta có thể tránh những trạng thái này dẫn đến bỏ lỡ các sự kiện. Cảm ơn bạn.
Tấn Nguyên

@James - Câu trả lời hay nhưng bây giờ tôi không thể đặtPeekHeight (). Bất kỳ ý tưởng?
Adarsh ​​Yadav

Tôi đã thử cái này. nó hoạt động cho tôi. Cảm ơn người anh em đã cứu tôi
Sup.Ia

1
Đây là một cách giải quyết tốt, mặc dù nó không được cập nhật cho đến ngày hôm nay. OnNestedPreScroll và một số phương pháp khác đã không được dùng nữa. Cần cập nhật các phương pháp đó và nó hoạt động tốt.
Ajay

4
Xin chào, nó không hoạt động trên BottomSheetDialogFragment, tôi vẫn có thể kéo trang dưới cùng
florian-do

23

Tôi đã viết một giải pháp thay thế để giải quyết trường hợp sử dụng này là vô hiệu hóa động kéo người dùng, theo đó BottomSheetBehavior được phân lớp để ghi đè onInterceptTouchEvent và bỏ qua nó khi cờ tùy chỉnh (trong trường hợp này là mAllowUserDragging) được đặt thành false:

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

Và trong xml bố cục của bạn:

    <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" />

Cho đến nay, đây là giải pháp hoạt động nhất quán nhất để vô hiệu hóa tính năng kéo người dùng trên Trang dưới cùng theo yêu cầu.

Tất cả các giải pháp khác dựa vào việc kích hoạt một lệnh gọi setState khác trong lệnh gọi lại onStateChanged đã dẫn đến việc BottomSheet chuyển sang trạng thái xấu hoặc gây ra các sự cố UX nghiêm trọng (trong trường hợp đăng lệnh gọi setState trong Runnable).

Hy vọng điều này sẽ giúp ai đó :)

cá đuối


4
Điều đó khá gọn gàng
Odys

3
@BeeingJk Thay vì FrameLayout, hãy sử dụng NestedScrollView và đặtbottomSheetFragContainer.setNestedScrollingEnabled(false);
AfzalivE 13/09/16

1
GIẢI QUYẾT: bằng cách thiết lập hành vi
LOG_TAG

3
Điều này không phù hợp với tôi! PS: Tôi có một văn bản cuộn trong bottomsheet
Thorvald Olavsen

6
Làm thế nào để bạn truyền nó trong khi khởi tạo? Điều này cho tôi cảnh báo WABottomSheetBehavior <View> behavior = (WABottomSheetBehavior) BottomSheetBehavior.from (sheetView);
Leo Droidcoder

8

Câu trả lời muộn, nhưng, đây là những gì hiệu quả với tôi, hơi khác so với những gì người khác đã đề xuất.

Bạn có thể thử đặt thuộc cancelabletính thành false, tức là

setCancelable(false);

và sau đó xử lý thủ công các sự kiện mà bạn muốn loại bỏ hộp thoại trong setupDialogphương thức.

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

Điều này hoạt động với ListView bên trong phân đoạn hộp thoại, đó là nơi tôi gặp một chút khó khăn với các giải pháp khác.


Giải pháp ngắn gọn tốt đẹp. Đối với bất kỳ ai đang đọc bài viết này, bạn (có thể) sẽ muốn kiểm tra thêm cho event.isCanceled()event.getAction() == MotionEvent.ACTION_UPtrước khi loại bỏ hộp thoại - điều này sẽ ngăn các nhấp chuột sai kích hoạt loại bỏ.
Eric Bachhuber

Cảm ơn vì điều đó. Đây là giải pháp đơn giản nhất để tắt tính năng kéo.
AVJ

7

Câu trả lời được chấp nhận không hoạt động trên thiết bị thử nghiệm đầu tiên tôi sử dụng. Và độ trả lại không được mượt mà. Có vẻ tốt hơn là chỉ đặt trạng thái thành STATE_EXPANDED sau khi người dùng giải phóng thao tác kéo. Sau đây là phiên bản của tôi:

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

1
Hãy để tôi cho bạn biết vấn đề với việc ném nó vào một chiếc xe có thể chạy được trừ khi đó là điều bạn muốn. Bạn không thể loại bỏ nó bằng một nút vì nó cần phải kéo để loại bỏ. Và, nó sẽ luôn luôn đáp ứng với kéo, chỉ là nó sẽ ngăn chặn người dùng kéo để sa thải
Abubakar Oladeji

7

Thêm mã này vào đối tượng BottomSheetBehavior . Kéo sẽ bị vô hiệu hóa. Hoạt động tốt cho tôi.

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) {

      }
});

1
Điều này không vô hiệu hóa thao tác vuốt. Nó làm sập hoàn toàn tờ dưới cùng.
Adam Hurwitz

7

Hành vi mong đợi:

  • BottomSheet không đóng khi kéo xuống
  • BottomSheet đóng nếu chạm vào bên ngoài cửa sổ hộp thoại

Mã:

class MyBottomSheet : BottomSheetDialogFragment () {

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

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

 }

Vì một số lý do, tôi không thể đóng hộp thoại khi chạm vào bên ngoài, nhưng nó hoạt động để vô hiệu hóa tính năng kéo
Gastón Saillén

5

Để khóa BottomSheet và tránh người dùng vuốt nó ra, đây là những gì tôi đã làm

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

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

Nó hoạt động khá tốt đối với tôi.


Giải pháp này rất hấp dẫn nhưng kỳ lạ là trang dưới cùng xuất hiện từ trên cùng của màn hình thay vì dưới cùng! Tuy nhiên, nó biến mất theo cách bình thường. Nó rất Star Trek.
Tunga

Tôi cần phải sửa đổi tầm nhìn và thay vào đó là sử dụng BottomSheetBehavior.STATE_HIDDEN. Trong trường hợp đó, bạn cũng không được gọi setPeekHeight(). Điều này ít phức tạp hơn nhiều so với các giải pháp khác ở đây.
HolySamosa

4

Cách dễ dàng để khóa kéo là setPeekHeight giống như chiều cao của chế độ xem. Ví dụ:

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

4

Một mẫu với BottomSheetDialogFragment. Nó hoạt động hoàn hảo.

Chỉnh sửa 09/04/2020: Thay thế khấu hao setBottomSheetCallback()bằngaddBottomSheetCallback()

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
    }

    ...
}

3

Bạn không cần phải chặn tất cả các sự kiện khi trang tính dưới cùng bị vô hiệu hóa. Bạn chỉ có thể chặn sự kiện ACTION_MOVE. Đó là lý do tại sao sử dụng hành vi trang tính dưới cùng tùy chỉnh như thế này

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

Làm thế nào để bạn sử dụng lớp học này? Tôi nhận được một IllegalArgumentException: Quan điểm là không liên quan đến BottomSheetBehavior
user3144836

3

Đây là phiên bản hoạt động của giải pháp hàng đầu trong 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
    }
}

Sau đó, bất cứ khi nào bạn muốn sử dụng:

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

Đây bottom_sheet_mainlà chế độ xem thực tế bằng Kotlin Android Extensions .


3

đặt bottomSheet onClickListener thành null.

bottomSheet.setOnClickListener(null);

dòng này chỉ tắt tất cả hành động về bottomSheet và không ảnh hưởng đến chế độ xem bên trong.


1
Điều này gây ra hoạt ảnh không mong muốn khi Trang tính dưới cùng đang cố gắng đóng.
Adam Hurwitz

3
implementation 'com.google.android.material:material:1.2.0-alpha05'

bạn có thể tắt tính năng kéo BottomSheet như thế này.

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), tôi hy vọng câu trả lời này có thể giải quyết vấn đề của bạn.


1
Phiên bản alpha này hoạt động một cách điên cuồng. Tôi không khuyên bạn nên :(
Adam Styrc

2

Tôi đã tìm thấy giải pháp tuyệt vời. Sự cố ban đầu là khi bottomSheet chuyển sang trạng thái HIDDEN sau đó nó không hiển thị ở bottomSheetDialog.show (). Nhưng tôi muốn hộp thoại hiển thị trên phương thức show () và cũng muốn cho phép người dùng vuốt nó xuống để nó giống như trang tính dưới cùng. Dưới đây là những gì tôi đã làm ..

    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) {

    }
};

cái này là một câu trả lời hoàn hảo
Vivek Kumar Srivastava

2
  1. Sao chép BottomSheetDialogvào dự án của bạn và đổi tên thànhMyBottomSheetDialog
  2. thêm getBottomSheetBehaviorvàoMyBottomSheetDialog
  3. sử dụng MyBottomSheetDialogthay thếBottomSheetDialog
  4. bottomSheetBehavior.setBottomSheetCallback

mã như thế này

public class MyBottomSheetDialog extends AppCompatDialog {

    // some code

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

    // more code

trong mã của bạn

    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) {

        }

2

Về cơ bản, đây là phiên bản kotlin của câu trả lời đúng ở trên cùng:

    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
}

Làm thế nào để bạn sử dụng lớp học này? Tôi nhận được một IllegalArgumentException: Quan điểm là không liên quan đến BottomSheetBehavior
user3144836

1
app: layout_behavior = "UserLockBottomSheetBehavior"> trong xml và sau đó trong mã, bạn làm như sau. // lấy chế độ xem trang tính dưới cùng LinearLayout llBottomSheet = (LinearLayout) findViewById (R.id.bottom_sheet); // init hành vi của trang tính dưới cùng BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from (llBottomSheet);
Jamal

1

Thử cái này.

1) Tạo trang tính dưới cùng và khai báo biến trong lớp java của bạn như

private BottomSheetBehavior sheetBehavior;

2) sheetBehavior = BottomSheetBehavior.from(bottomSheet);

3) Trong chức năng gọi lại trang tính dưới cùng, thêm các dòng sau.

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) {

            }
        });

1

Đầu tiên, tôi chỉ muốn gửi lời cảm ơn đến tất cả các bạn đã cố gắng đưa ra câu trả lời. Tôi chỉ viết câu trả lời này bằng cách giải quyết vấn đề này như tôi muốn. Tôi sẽ mô tả cách tôi làm điều đó từng bước bằng cách nhận trợ giúp từ đây.

Hình dung: Sau khi nhấp vào Nút, Show BottomSheetbạn sẽ thấy màn hình thứ hai . Bây giờ bạn sẽ thấy rằng BottomSheet chỉ bị khóa để kéo . Nhưng nếu bạn nhấp vào Danh sách quốc gia , BottomSheet sẽ ẩn. Đây là mô tả bây giờ chúng ta hãy tìm hiểu về Code.

  • Đầu tiên, hãy thêm thư viện hỗ trợ thiết kế vào tệp build.gradle của bạn :

    triển khai 'com.android.support:design:28.0.0'

  • UserLockBottomSheetBehavior.java : Tín dụng: 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;
    }

}
  • ottomsheet.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);
    }
}

Màn hình đầu tiên Màn hình thứ hai


1

Giải pháp từ câu trả lời được chấp nhận hầu hết đã hiệu quả với tôi, nhưng với một vấn đề: các chế độ xem, nằm sau chế độ xem trang dưới cùng, bắt đầu phản ứng với các sự kiện chạm, nếu sự kiện chạm đang xảy ra trên khu vực của trang dưới cùng, không có chế độ xem con. Nói cách khác, như bạn có thể thấy trong hình ảnh bên dưới, khi người dùng trượt ngón tay vào bên trong trang tính dưới cùng, thì bản đồ bắt đầu phản ứng trên đó.

khu vực chạm tờ dưới cùng

Để khắc phục sự cố, tôi đã sửa đổi onInterceptTouchEventphương pháp bằng cách đặt touchListenerở chế độ xem dưới cùng (phần còn lại của mã vẫn giống như trong giải pháp được chấp nhận).

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

1

Với 'com.google.android.material:material:1.2.0-alpha06'

Hoạt động tốt với NestedScrollViewRecyclerView

Mã ví dụ:

    LinearLayout contentLayout = findViewById(R.id.contentLayout);
    sheetBehavior = BottomSheetBehavior.from(contentLayout);
    sheetBehavior.setDraggable(false);

0

Điều chỉnh peakHeightgiá trị phù hợp với tôi.

Tôi đặt đỉnh cao làm chiều cao của biểu đồ đáy nếu nó được mở rộng.

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

1
Điều này không lý tưởng vì nó có thể gây ra các hình ảnh động bất ngờ.
Adam Hurwitz

Trong trường hợp của tôi. Nó không gây ra bất kỳ vấn đề hình ảnh động nào cả. Nó chỉ không di chuyển sau khi thẻ được mở rộng. Nó không lý tưởng nhưng nó đã hoạt động như mong đợi!
pz64_

Thật thú vị, đó có thể là trường hợp. Tôi đã giải quyết vấn đề với việc Trang tính dưới cùng của tôi đóng đột ngột bằng cách đặt Thanh công cụ của CollapsingToolbarLayout thành Ẩn mặt hoặc Đi qua khi Trang tính dưới cùng đang mở. Một tương tác chạm liên quan đến Thanh công cụ mặc dù nó nằm bên dưới khiến Trang dưới cùng đóng bất ngờ. Sự cố hiện đã được khắc phục.
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();

0

đây là kết quả đầu tiên trên google nên tôi tin rằng thật hợp lý khi đưa giải pháp đơn giản vào đây:

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

và không chỉ gọi nó từ onCreateView()trong quá trình BottomSheetDialogFragmenttriển khai


0

Tôi có cùng một vấn đề trong BottomSheetDialogFragmentvà áp dụng nhiều giải pháp sử dụng behaviorcủa dialognhưng không ai trong số những người giải quyết vấn đề của tôi và sau đó tôi giải quyết nó nhưng thiết lập setCancelable(false);tại thời điểm khởi tạo của dialog.

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

Thao tác này sẽ tắt cử chỉ đang bật BottomSheetDialogFragmentvà bạn có thể loại bỏ dialogtheo chương trình bằng cách sử dụng dismiss();chức năng.


-1

Tôi đã gặp vấn đề tương tự, tôi đã giải quyết vấn đề này bằng mã. Nó sẽ không cho phép người dùng kéo trang tính. bạn cần xử lý trạng thái theo chương trình.

 mBottomSheetBehavior.isDraggable = false

-2

Chỉ cần sử dụng: bottomSheet.dismissOnDraggingDownSheet = false

Sao chép từ trang web Material.io:

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

// **** Dòng này ngăn loại bỏ bằng cách kéo bottomSheet ****

bottomSheet.dismissOnDraggingDownSheet = false

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


nó dành cho iOS ở đây không phải Android
Back Packer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.