bottomsheet 点击以外的地方关闭bottomsheet
时间: 2023-09-01 10:08:34 浏览: 203
要实现 BottomSheet 点击以外的地方关闭,可以使用 BottomSheetBehavior 中的 setBottomSheetCallback 方法来监听 BottomSheet 的状态,并在状态改变时关闭 BottomSheet。具体实现步骤如下:
1. 在 BottomSheet 的布局文件中,设置一个遮罩层的 View,设置其背景颜色为半透明的黑色。
2. 设置 BottomSheet 的背景为透明色,即 android:background="@android:color/transparent"。
3. 在代码中,通过 findViewById 获取到遮罩层 View 对象,设置其点击事件,点击时关闭 BottomSheet。
4. 使用 BottomSheetBehavior 的 setBottomSheetCallback 方法监听 BottomSheet 的状态,在 BottomSheet 状态为 STATE_HIDDEN 时关闭遮罩层。
示例代码如下:
布局文件 bottom_sheet_layout.xml:
```
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent">
<!-- 遮罩层 -->
<View
android:id="@+id/mask_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#80000000"
android:visibility="gone"
android:clickable="true" />
<!-- BottomSheet 内容 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:orientation="vertical">
<!-- BottomSheet 内容布局 -->
</LinearLayout>
</RelativeLayout>
```
Java 代码:
```
public class MyBottomSheetDialogFragment extends BottomSheetDialogFragment {
private View mMaskView;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.bottom_sheet_layout, container, false);
// 获取遮罩层 View 对象
mMaskView = view.findViewById(R.id.mask_view);
// 设置点击遮罩层关闭 BottomSheet
mMaskView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
// 设置显示遮罩层
mMaskView.setVisibility(View.VISIBLE);
// 监听 BottomSheet 状态改变,在状态为 STATE_HIDDEN 时关闭遮罩层
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_HIDDEN) {
mMaskView.setVisibility(View.GONE);
}
}
@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
}
});
return view;
}
}
```
这样就可以实现点击以外的地方关闭 BottomSheet 了。
阅读全文