记得第一次使用PopupWindow是写一个按钮点击后弹出菜单的小玩意。那时候最纠结的就是PopupWindow显示的位置总是不尽人意。那时候试过这些方法:
// 相对某个控件的位置(正左下方),无偏移量
PopupWindow.showAsDropDown(View anchor)
// 相对某个控件的位置,有偏移,xoff 为 X 轴的偏移量,yoff 为 Y 轴的偏移量
PopupWindow.showAsDropDown(View anchor, int xoff, int yoff)
// 在父容器的什么位置,gravity 为相对位置,如:正中央 Gravity.CENTER、下方 Gravity.BOTTOM、Gravity.RIGHT|Gravity.BOTTOM 右下方等,后面两个参数为 x/y 轴的偏移量。
PopupWindow.showAtLocation(View parent, int gravity, int x, int y)
虽然最后是成功解决了问题。但是感觉有些时候使用起来很麻烦。因为需要通过父容器以及PopupWindow自身的大小来进行计算偏移量。最后的我解决方案是直接将PopupWindow的大小设置为全屏。
Rect outRect = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect);//获取屏幕的大小
PopupWindow popupWindow = new PopupWindow(view, outRect.width(), outRect.height());//设置PopupWindow的大小为除通知栏之外的全屏幕
popupWindow.showAsDropDown(View.inflate(this, R.layout.activity, null), 0, outRect.top);//设置PopupWindow的显示位置为除通知栏的全屏幕
这时候要注意的是。你设置成全屏大小了。不可能全屏都是你的菜单吧。所以要在空白部分放上一个空的View。还要加上点击事件。直接调用dismiss方法。以达到使PopupWindow关闭的目的。
view.findViewById(R.id.view).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
popupWindow.dismiss();
}
});
这下就爽了。然后很多时候我也喜欢这么用了。因为我可以很任性的设置PopupWindow所该存在的位置。但是有有问题了。。就是对于类似一个ListView里面的Item点击弹出PopupWindow的。。因为弹出的PopupWindow一样。但是位置不一样。于是。我又老老实实的用回了相对位置的方法。。当然,使用的时候要学会具体情况具体分析昂。
然后是一些关于PopupWindow我遇到的一些小问题的解决方法:
PopupWindow打开和关闭动画:
popupWindow.setAnimationStyle(R.style.AnimationPreview);//设置动画文件
<style name="AnimationPreview">
<item name="android:windowEnterAnimation">@anim/show_win_in</item><--打开动画-->
<item name="android:windowExitAnimation">@anim/show_win_out</item><--<span style="font-family:Arial, Helvetica, sans-serif;">关闭动画--></span>
</style>
show_win_in和show_win_out里面就是最基本的动画资源文件了。
PopupWindow中ListView点击无响应:
popupWindow.setFocusable(true);