首页 > 解决方案 > 如何在适配器 kotlin 中打开全屏底部对话框

问题描述

我如何在全屏模式下打开底部对话框。但每当我点击它时,它只会打开半屏视图,而不是我滚动到全屏。但还有一件事是在适配器类中

    var flashAlertPopUp = FareDetailBottomSheet(data.fare_details)
    flashAlertPopUp.show(childFragmentManager, "")

标签: androidxmlkotlinbottom-sheet

解决方案


setupDialog()在您的孩子中覆盖以BottomSheetDialogFragment将其设置为随着屏幕尺寸的高度而扩展,如下所示:

override fun setupDialog(dialog: Dialog, style: Int) {
    super.setupDialog(dialog, style)
    val parentView = rootView.parent as View
    val params = parentView.layoutParams as CoordinatorLayout.LayoutParams
    val behavior = params.behavior
    if (behavior != null && behavior is BottomSheetBehavior<*>) {
        behavior.state = BottomSheetBehavior.STATE_EXPANDED
        behavior.peekHeight = requireContext().screenSize.y
    }
}

val Context.screenSize: Point
    get() = Point().also {
        (getSystemService(Context.WINDOW_SERVICE) as? WindowManager)?.defaultDisplay?.getSize(it)
    }


在 Java 代码中:

public class FareDetailBottomSheet extends BottomSheetDialogFragment {

    private View rootView;

    @SuppressLint("RestrictedApi")
    @Override
    public void setupDialog(@NonNull Dialog dialog, int style) {
        super.setupDialog(dialog, style);
        // layoutResId: your layout resource id
        rootView = View.inflate(requireContext(), layoutResId, null);
        dialog.setContentView(rootView);
        onInitViews();

        View parentView = (View) rootView.getParent();
        CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) parentView.getLayoutParams();
        CoordinatorLayout.Behavior behavior = params.getBehavior();
        if (behavior instanceof BottomSheetBehavior) {
            ((BottomSheetBehavior) behavior).setState(BottomSheetBehavior.STATE_EXPANDED);
            ((BottomSheetBehavior) behavior).setPeekHeight(getScreenSize().y);
        }
    }

    private void onInitViews() {
        // do your initialization here...
        // for example:
        // TextView textView = rootView.findViewById(R.id.textView);
    }

    private Point getScreenSize() {
        Point point = new Point();
        WindowManager wm = (WindowManager) requireContext().getSystemService(Context.WINDOW_SERVICE);
        if (wm.getDefaultDisplay() != null) {
            wm.getDefaultDisplay().getSize(point);
        }
        return point;
    }
}

推荐阅读