2

我有一个弹出窗口附加到对话框活动中的“按钮”(实际上是 TextView):

AndroidManifest.xml

<activity android:name="com.MyActivity"
          android:theme="@android:style/Theme.Dialog"/>

my_activity_layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="290dp"
    android:layout_height="200dp"
    android:orientation="vertical" >

    etc...

</LinearLayout>

我的活动:

PopupWindow popupWindow = new PopupWindow(this);
popupWindow.setWidth(250);
popupWindow.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);

TextView dropDownView = findViewById(R.id.dropDownView);

最后在 dropDownView onClickListener() 中:

popupWindow.showAsDropDown(v, -5, 0);  //where v=dropDownView

它很好地在我的 TextView 下方显示了一个下拉框。但是,弹出窗口被剪裁到对话框的边界(即弹出窗口的下限在对话框的边缘结束并且启用滚动)。我可以设置以下内容:

popupWindow.setClippingEnabled(false);

这确实允许下拉列表扩展到对话框之外,但不幸的是窗口也是如此。有没有办法让弹出窗口扩展到对话框之外但受窗口限制(从而在弹出窗口大于窗口时提供滚动)?

4

1 回答 1

2

好吧,我终于找到了解决这个问题的方法:

int[] location = new int[2];
view.getLocationOnScreen(location); //get physical location in Px
DisplayMetrics displaymetrics = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int screenHeightPx = displaymetrics.heightPixels;
int maxHeight = screenHeightPx - location[1] - view.getHeight() - 20; 

PopupWindow popupWindow = new PopupWindow(this);
....
popupWindow.setHeight(maxHeight);
popupWindow.setClippingEnabled(false);

他们这里的关键是找到弹出窗口的锚点视图在屏幕上的位置。从屏幕的最大高度减去它的 y 坐标,得到从视图左上角到屏幕底部的距离。从这里我去掉了锚视图的高度(以获得底部边缘的 y 坐标),最后还有 20 个用于填充(可能应该先将其转换为 DP)。

于 2013-11-11T22:05:38.257 回答