OptionsPickerView、TimePickerView在popupwindow中弹出被覆盖的问题

本文讲述了在项目中遇到的筛选按钮弹出OptionsPickerView时层级问题的解决方案,通过调整popupwindow的decorView并设置相关参数,确保选择器平级展示且避免了遮挡和同时消失的问题。
摘要由CSDN通过智能技术生成

参考文档:https://blog.csdn.net/qq_42259105/article/details/103306991#comments_14786746

问题:项目中的筛选按钮,点击之后弹出popupwindow,popupwindow里面有条件选择器,点击之后弹出OptionsPickerView,问题是,OptionsPickerView在popupwindow的层级下面,当想滑动选择时,popupwindow直接不可见了。

各种百度,搜索到的比较靠谱的说法是上面的参考链接,用的是".isDialog(true)",当时做这个项目更改的时候,评论里还没有设置这个之后,选择器被居中的解决方案,所以是按照另一种方式进行解决的,在此记录一下:

关键点也在于初始化方法中(标蓝的这行),采取的是非dialog模式,里面有一个decorview,默认是activity的根view,这也解释了为什么选择器弹出框跑到了popupwindow的下面。

因为decorview对外开放了参数,可以设置,所以当时的解决方法是在弹出的popupwindow的自定义布局的最下面加上默认的弹出位置,相当于与popupwindow是平级展示的

通过.setDecorView(ll_pop)来设置,处理之后,显示样式没问题了,但由于是平级的关系,当点击空白位置时,popupwindow与下面的pickview同时消失,当点击筛选的时候又同时显示了,而且在弹出时,会有默认颜色占位显示的情况,解决办法是在popupwindow的显示和消失方法中分别判断选择器是否正在展示

其他的popupwindow相关参数的设置如下:

        setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
        setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
        setFocusable(true);//设置是否获取焦点
        setAnimationStyle(R.style.AnimBottom);//设置动画
        setBackgroundDrawable(new ColorDrawable(context.getResources().getColor(R.color.transparent)));//设置背景透明
        setOutsideTouchable(false);//点击PopupWindow 以外区域是否可以隐藏
        setTouchable(true);
        setClippingEnabled(true);//允许弹出窗口超出屏幕范围。默认情况下,窗口被夹到屏幕边界。设置为false将允许Windows精确定位。也就是说,如果这个PopupWindow显示区域 不足或者层叠将导致绘制位置计算不准确,需要手动设置为false
//       setSplitTouchEnabled(true);

至此,也解决了上述的问题。今天再看到参考链接中的解决办法的时候,好像确实比上述的方法要简单一些,这里也贴一下解决方案:

        .isDialog(true)
           ...
        .build();
 
        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM);
        params.leftMargin = 0;
        params.rightMargin = 0;
        ViewGroup contentContainer = pvTime.getDialogContainerLayout();
        contentContainer.setLayoutParams(params);
        pvTime.getDialog().getWindow().setGravity(Gravity.BOTTOM);//可以改成Bottom
        pvTime.getDialog().getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);
        pvTime.show();

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值