1.自定义MyBottomSheetDialog,设置高度为屏幕3/2,去除状态栏
/** * 设置dialog 的总高度为固定的值 * */ public class MyBottomSheetDialog extends BottomSheetDialog { public MyBottomSheetDialog(@NonNull Context context) { super(context); } public MyBottomSheetDialog(@NonNull Context context, int theme) { super(context, theme); } protected MyBottomSheetDialog(@NonNull Context context, boolean cancelable, OnCancelListener cancelListener) { super(context, cancelable, cancelListener); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); int screenHeight = getScreenHeight(getContext()); if(screenHeight == 0){ screenHeight = 1920; } Window window = getWindow(); assert window != null; //设置成沉浸式 // window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, dialogHeight); //需要设置最大高度 给dialog设置一个固定的高度 //你想要减去的高度,dialog默认最大高度在状态栏下方 // float reduceHeight = getContext().getResources().getDimension(R.dimen.qb_px_120); int reduceHeight = ScreenUtils.getStatusBarHeight(getContext()); // window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, (int) (dialogHeight - reduceHeight)); window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, (int) (screenHeight/3*2 - reduceHeight)); // 最后一步是必须的,否则BottomSheetDialog会显示在屏幕中间,底部会出现空白区域 window.setGravity(Gravity.BOTTOM); } /** * 获取屏幕的高度 * @param context * @return */ public static int getScreenHeight(Context context) { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Point point = new Point(); assert wm != null; wm.getDefaultDisplay().getSize(point); return point.y; } }
2.设置内容的高度,内容为RecycleView
int bottomDialogHeight = ScreenUtils.getScreenHeight(mContext)/3*2 - ScreenUtils.getStatusBarHeight(mContext); //设置内容布局高度 去除了栏中的标题的高度 rlDialogRecommLayout.setMinimumHeight((int) (bottomDialogHeight - mContext.getResources().getDimension(R.dimen.qb_px_132)));
3.设置高度 避免状态栏也黑色
//设置高度 避免状态栏也黑色 int dialogHeight = bottomDialogHeight; getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, dialogHeight == 0 ? ViewGroup.LayoutParams.MATCH_PARENT : dialogHeight);
4.背景设置为透明,可以显示圆角
//设置圆角背景不生效 原因:由于它上面蒙了一层布局 design_bottom_sheet是系统的布局,直接找到它,然后给它设全透明就好了 FrameLayout bottomSheet = (FrameLayout) getDelegate().findViewById(R.id.design_bottom_sheet); bottomSheet.setBackgroundColor(mContext.getResources().getColor(R.color.transparent)); //设置dialog的下拉拖拽与scrollView下拉冲突 bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet); bottomSheetBehavior.setPeekHeight(bottomDialogHeight);//此处是dialog设置的最大高度