解决使用BottomSheetDialog底部虚拟导航栏NavigationBar的颜色

最新版本的BottomSheetDialog状态栏发黑问题已经没有了但是虚拟导航栏还是会发黑。
华为手机在使用BottomSheetDialog的时候底部虚拟导航栏总是黑色的看着和App整个UI不搭配
在这里插入图片描述
这里可以看到底部是黑色,要想解决需要单独为底部虚拟导航栏设置一下

    @RequiresApi(api = Build.VERSION_CODES.M)
    private void setWhiteNavigationBar(@NonNull Dialog dialog) {
        Window window = dialog.getWindow();
        if (window != null) {
            DisplayMetrics metrics = new DisplayMetrics();
            window.getWindowManager().getDefaultDisplay().getMetrics(metrics);

            GradientDrawable dimDrawable = new GradientDrawable();

            GradientDrawable navigationBarDrawable = new GradientDrawable();
            navigationBarDrawable.setShape(GradientDrawable.RECTANGLE);
            navigationBarDrawable.setColor(Color.WHITE);//这里设置颜色

            Drawable[] layers = {dimDrawable, navigationBarDrawable};

            LayerDrawable windowBackground = new LayerDrawable(layers);
            windowBackground.setLayerInsetTop(1, metrics.heightPixels);

            window.setBackgroundDrawable(windowBackground);
        }
    }

当然整个设置方法我也是从别人那里学的,地址如下
https://stackoverflow.com/questions/47553936/prevent-bottomsheetdialogfragment-covering-navigation-bar
上面操后就Ok了,效果如下
在这里插入图片描述
完整代码如下

//标签选择页面
public class TagDataSelectFragment extends BottomSheetDialogFragment {


    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        BottomSheetDialog dialog = new BottomSheetDialog(getActivity());
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
            setWhiteNavigationBar(dialog);
        }

        return dialog;
    }

    @Override
    public void onStart() {
        super.onStart();
        //获取dialog对象
        BottomSheetDialog dialog = (BottomSheetDialog) getDialog();
        Window window = dialog.getWindow();
        //设置Dialog背景透明
        window.findViewById(R.id.design_bottom_sheet).setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        //全屏展示的操作
		final View view = getView();
		view.post(new Runnable() {
		   @Override
		   public void run() {
		     View parent = (View) view.getParent();
		     CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) (parent).getLayoutParams();
		     CoordinatorLayout.Behavior behavior = params.getBehavior();
		     mBehavior = (BottomSheetBehavior) behavior;
		     mBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
		   }
		 });
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_tag_select, container, false);
        return view;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    }


    @RequiresApi(api = Build.VERSION_CODES.M)
    private void setWhiteNavigationBar(@NonNull Dialog dialog) {
        Window window = dialog.getWindow();
        if (window != null) {
            DisplayMetrics metrics = new DisplayMetrics();
            window.getWindowManager().getDefaultDisplay().getMetrics(metrics);

            GradientDrawable dimDrawable = new GradientDrawable();
            
            GradientDrawable navigationBarDrawable = new GradientDrawable();
            navigationBarDrawable.setShape(GradientDrawable.RECTANGLE);
            navigationBarDrawable.setColor(Color.WHITE);

            Drawable[] layers = {dimDrawable, navigationBarDrawable};

            LayerDrawable windowBackground = new LayerDrawable(layers);
            windowBackground.setLayerInsetTop(1, metrics.heightPixels);

            window.setBackgroundDrawable(windowBackground);
        }
    }

}
### MT6572 设备上 NavigationBar 的常见问题及解决方案 对于基于 MTK 平台特别是 MT6572 芯片组的设备,在处理 NavigationBar 显示与隐藏方面存在一些常见的调整方法。 #### 隐藏 Navigation Bar 为了使 MT6572 设备不显示 Navigation Bar,可以在 `device/mediatek/common/overlay/navbar/frameworks/base/core/res/res/values/config.xml` 文件中将 `<bool name="config_showNavigationBar">true</bool>` 更改为 `<bool name="config_showNavigationBar">false</bool>`[^1]。此操作会直接控制导航栏是否可见。 另外一种方式是在系统的 `.prop` 文件里设置 `qemu.hw.mainkeys=1` 来替代默认值 `0`,这同样可以达到隐藏效果[^3]。具体命令如下: ```bash find device/mediatek -name "*.prop" | xargs grep qemu.hw.mainkeys ``` 找到对应的文件并做相应更改即可生效。 #### 自定义 Navigation Bar 行为 如果希望自定义 Navigation Bar 的行为模式,则可以通过编辑 `frameworks/base/core/res/res/values/config.xml` 中名为 `config_navBarInteractionMode` 参数来实现不同类型的交互体验[^2]。该参数支持三种不同的数值选项: - **0**: 传统三键布局(返回、主页、概览) - **1**: 双键加手势组合(返回、主页按钮加上滑查看最近任务) - **2**: 完全的手势操控形式 例如要切换至完全手势模式,只需确保上述路径中的 XML 文件含有如下配置项: ```xml <integer name="config_navBarInteractionMode">2</integer> ``` 这些改动通常适用于大多数采用 Mediatek 方案的产品,并且能够有效改善用户体验或满足特殊需求场景下的应用开发要求。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值