popwindow点击之后计算高度

本文介绍了一个使用PopupWindow显示自定义视图的方法。该方法通过LayoutInflater加载布局资源,并根据需要显示的内容进行填充。同时,详细说明了如何测量PopupWindow的大小、设置触摸反馈及背景等属性。
private void showPopupWindow(View view) {
        View contentView = LayoutInflater.from(getContext()).inflate(
                R.layout.popupwindow_introduction, null);
        //收益方式描述
        TextView tvIncomeDesc = (TextView) contentView.findViewById(R.id.tv_pop_content);
        String incomeDesc = fixedPeriodInvestProdResp.getIncomeDesc();
        if (!TextUtils.isEmpty(incomeDesc)) {
            tvIncomeDesc.setText(incomeDesc);
        }

        final PopupWindow popupWindow = new PopupWindow(contentView,
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, true);
         //代码计算高度 
         popupWindow.getContentView().measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
        popupWindow.setTouchable(true);
        // 如果不设置PopupWindow的背景,无论是点击外部区域还是Back键都无法dismiss弹框
        popupWindow.setBackgroundDrawable(getResources().getDrawable(
                R.drawable.pop_bg_introduction_civmode));
        int xoff = (view.getWidth() - popupWindow.getContentView().getMeasuredWidth()) / 2;
        popupWindow.showAsDropDown(view, xoff, 0);

    }
在 Android 开发中,`PopupWindow` 本身并没有直接提供设置最大高度的属性,但可以通过一些技巧来实现类似的效果。以下是几种常见的实现方式: ### 1. 使用 `ScrollView` 和动态设置高度 在 `PopupWindow` 的布局中使用 `ScrollView` 包裹内容,并通过代码动态计算并设置 `ScrollView` 的最大高度。这种方法适用于内容动态变化的场景。 ```xml <!-- popup_content.xml --> <ScrollView android:id="@+id/scrollView" android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" /> </ScrollView> ``` 在 Java/Kotlin 中动态设置最大高度: ```kotlin val popupView = LayoutInflater.from(context).inflate(R.layout.popup_content, null) val scrollView = popupView.findViewById<ScrollView>(R.id.scrollView) // 设置最大高度为屏幕高度的 50% val screenHeight = context.resources.displayMetrics.heightPixels val maxHeight = (screenHeight * 0.5f).toInt() scrollView.post { val layoutParams = scrollView.layoutParams layoutParams.height = Math.min(scrollView.getChildAt(0).measuredHeight, maxHeight) scrollView.layoutParams = layoutParams } val popupWindow = PopupWindow(popupView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, true) popupWindow.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) popupWindow.showAtLocation(parentView, Gravity.CENTER, 0, 0) ``` ### 2. 设置 `PopupWindow` 的高度为固定值或根据内容调整 如果希望 `PopupWindow` 的高度在内容较多时不超过屏幕的一定比例,可以使用 `WRAP_CONTENT` 并结合 `setMaxHeight` 方法来限制最大高度。 ```kotlin val contentView = LayoutInflater.from(context).inflate(R.layout.popup_content, null) val popupWindow = PopupWindow(contentView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, true) // 设置背景以确保点击外部可以关闭弹窗 popupWindow.setBackgroundDrawable(ColorDrawable(Color.WHITE)) // 显示 PopupWindow popupWindow.showAtLocation(parentView, Gravity.CENTER, 0, 0) // 设置最大高度 val screenHeight = context.resources.displayMetrics.heightPixels val maxHeight = (screenHeight * 0.5f).toInt() contentView.post { val contentHeight = contentView.measuredHeight if (contentHeight > maxHeight) { contentView.layoutParams.height = maxHeight contentView.requestLayout() } } ``` ### 3. 使用 `OnDismissListener` 监听弹窗关闭事件 为了实现弹窗关闭时的动画效果或背景透明度变化,可以设置 `OnDismissListener`: ```kotlin popupWindow.setOnDismissListener { // 这里可以执行背景恢复或透明度调整 backgroundAlpha(1f) } ``` 其中 `backgroundAlpha` 是一个自定义方法,用于调整背景透明度: ```kotlin fun backgroundAlpha(alpha: Float) { val layoutParams = activity.window.attributes layoutParams.alpha = alpha activity.window.attributes = layoutParams } ``` ### 总结 通过 `ScrollView` 动态计算高度、限制 `PopupWindow` 的最大高度、结合 `OnDismissListener` 实现关闭动画,可以有效实现 `PopupWindow` 的最大高度控制需求。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值