如何在Toolbar下方显示带背景变暗效果的TopSheetDialog
解决方案
一、实现背景变暗效果
TopSheetDialog 继承自 BottomSheetDialog,可通过调整窗口的 dim 属性快速实现背景变暗:
- 若允许修改库代码,直接重写 TopSheetDialog 的
onCreate方法:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Window window = getWindow(); if (window != null) { // 设置背景变暗程度(0.0f 完全不暗,1.0f 完全黑暗,可按需调整) window.setDimAmount(0.6f); // 开启背景变暗的系统 flag window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); } }
- 若不想修改库代码,可在调用
show()后直接配置窗口:
TopSheetDialog dialog = new TopSheetDialog(context); dialog.show(); Window window = dialog.getWindow(); if (window != null) { window.setDimAmount(0.6f); window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); }
二、让Sheet显示在Toolbar下方
核心思路是获取Toolbar的高度,给Sheet的根布局设置顶部外边距,确保Sheet从Toolbar下方开始弹出:
方法1:动态调整Sheet根布局的外边距
Toolbar toolbar = findViewById(R.id.your_toolbar_id); TopSheetDialog dialog = new TopSheetDialog(context); // 监听Toolbar测量完成事件,避免获取到高度为0 toolbar.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { toolbar.getViewTreeObserver().removeOnGlobalLayoutListener(this); int toolbarHeight = toolbar.getHeight(); // 获取Sheet的根布局(对应BottomSheetDialog的默认布局ID) View sheetRoot = dialog.findViewById(com.google.android.material.R.id.design_bottom_sheet); if (sheetRoot != null) { FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) sheetRoot.getLayoutParams(); params.topMargin = toolbarHeight; sheetRoot.setLayoutParams(params); } dialog.show(); } });
方法2:直接调整窗口的顶部偏移
如果Sheet的窗口是全屏模式,也可以直接修改窗口布局参数实现偏移:
dialog.show(); Window window = dialog.getWindow(); if (window != null && toolbar != null) { WindowManager.LayoutParams params = window.getAttributes(); params.y = toolbar.getHeight(); // 窗口顶部向下偏移Toolbar的高度 window.setAttributes(params); }
额外注意事项
- 若使用系统ActionBar而非自定义Toolbar,可通过
getSupportActionBar().getHeight()获取高度,但需确保ActionBar已完成初始化。 - 若Toolbar包含状态栏高度(比如沉浸式布局),需额外加上状态栏高度,可通过以下工具方法获取:
public int getStatusBarHeight(Context context) { int result = 0; int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = context.getResources().getDimensionPixelSize(resourceId); } return result; }
此时顶部偏移值需改为 toolbarHeight + getStatusBarHeight(context)。
内容的提问来源于stack exchange,提问作者Sreehari K
相关产品推荐
相关产品推荐

