PopupWindow设置宽高wrap_content无效

时间:2024-02-20 18:36:18

之前一直都是pop的布局,直接用一个match_parent的半透明的蒙版,然后中间再显示,这个大概也算一种解决wrap_content无效的方法,但是这个假如加上pop的进出动画的话,会带着蒙版一起进出,不太好看,也可以背景全透明,然后设置窗口的setAttributs,但感觉是掩耳盗铃。设置宽高wrap_content无效的问题,是部分的,比较讲缘分,所以搜到的讯息不多。

我碰到的问题是:在布局文件中设置了固定宽高:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="270dp"
    android:layout_gravity="center"
    android:background="@drawable/round_rect15_white"
    android:layout_height="136dp">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="提示"
        android:textColor="@color/black_03"
        android:textSize="17sp"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="14dp"/>

    <TextView
        android:id="@+id/tv_explain"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="13sp"
        android:textColor="@color/black_03"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="53dp"/>
    
    <LinearLayout
        android:id="@+id/ll_bt"
        android:layout_width="match_parent"
        android:layout_height="43dp"
        android:orientation="horizontal"
        android:layout_alignParentBottom="true">
        <Button
            android:id="@+id/bt_cancel"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:textColor="@color/black_55"
            android:textSize="17sp"
            android:background="@color/white"
            android:text="@string/cancel"/>
        <Button
            android:id="@+id/bt_next"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:textColor="#007AFF"
            android:textSize="17sp"
            android:background="@color/white"
            android:text="@string/ok"/>
        
    </LinearLayout>
    <View
        android:layout_width="match_parent"
        android:layout_height="0.5dp"
        android:layout_above="@+id/ll_bt"
        android:background="#784D4D4D"/>

</RelativeLayout>

然后再在自定义pop里面

LayoutInflater inflater = (LayoutInflater) context
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View mView = inflater.inflate(R.layout.delete_popup_window, null);
setContentView(mView);
setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);

这应该是网上大部分教程的写法,感觉是很合情合理,我设置了宽高,然后让popwupwindow自适应我的布局文件,进行显示,但是结果是:


额。图片有点大。设置显示方式是showAtLocation。但是结果却是,看着是match_parent。

我的理解是,popupwindow设置的宽高,把layout的viewgroup的宽高给顶掉了,当layout的外层变成wrap_content,里面设置的match_parent,就会使得layout布局充满整个屏幕。

解决方法1:将布局文件中的match_parent都变成wrap_content,或者对长宽加以限制。设置popupwindow的固定长宽。但是有时候写布局又很难避过。

解决办法2:既然是把viewGroup给顶掉了,那加一个viewGroup就行了,可以在布局中加,也可以在设置popupWindow中

LayoutInflater inflater = (LayoutInflater) context
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout linearLayout = new LinearLayout(context);
View mView = inflater.inflate(R.layout.delete_popup_window, linearLayout);

在将布局文件infate的时候,给它加一个viewGroup,再把这个view设置给pop,这个LayoutInflater.inflater第二个参数本来就是ViewGroup,只是一般把他写成了null

public View inflate(@LayoutRes int resource, @Nullable ViewGroup root) {
    return inflate(resource, root, root != null);
}

最后的结果,额,忘记把按钮也设置圆角了,希望能帮到大家: