主要是想搞懂一下三个函数:
1
|
showAsDropDown(anchor);
|
1
|
showAsDropDown(anchor, xoff, yoff);
|
1
|
showAtLocation(parent, gravity, x, y);
|
parent:传你当前Layout的id;
gravity:Gravity.BOTTOM(以屏幕左下角为参照)... 偏移量会以它为基准点 当x y为0,0是出现在底部居中
前面两个实测没问题,下面是布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#bbbaaa" >
<RelativeLayout
android:id="@+id/rl"
android:layout_width="match_parent"
android:layout_height="500dp"
android:background="#00fff0" >
<TextView
android:id="@+id/textview"
android:layout_width="match_parent"
android:layout_height="300dp"
android:background="#00ff00"
android:text="show PopUpWindow"
android:textColor="#ff0000" />
</RelativeLayout>
</RelativeLayout>
其中最外层是白色,中间层是红色,textview在最里层,主要代码是点击textview显示PopupWindow:
private void showPopupWindow(View view) {
// 一个自定义的布局,作为显示的内容
View contentView = LayoutInflater.from(this).inflate(
R.layout.pop_window, null);
popupWindow = new PopupWindow(contentView, LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT, true);
popupWindow.setTouchable(true);
popupWindow.setTouchInterceptor(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return false;
// 这里如果返回true的话,touch事件将被拦截
// 拦截后 PopupWindow的onTouchEvent不被调用,这样点击外部区域无法dismiss
}
});
// 如果不设置PopupWindow的背景,无论是点击外部区域还是Back键都无法dismiss弹框
popupWindow.setBackgroundDrawable(getResources().getDrawable(
R.drawable.ic_launcher));
// 设置好参数之后再show
popupWindow.showAsDropDown(textview);//第一种<span style="font-family:Arial, Helvetica, sans-serif;"> 传入的view是textview,</span>弹出在textView的整下方
// popupWindow.showAsDropDown(textview, 10, 0); //第二种 弹出在textview的正下方并向右偏移10像素
// popupWindow.showAtLocation(textview, Gravity.TOP, 0,getStatusBarHeight()+getTitleHeight()+textview.getHeight());//第三种,传入的textview
上面popupwindow有三种情况,第一种,第二种,第三种情况显示如下:
主要看第三张,尽管传入的是textview,但是Gravity.TOP却实以整个屏幕为基准,并不是以textview为基准,经测试,传入的不管是最外层的白色布局view还是红色布局view,上面showAtLocation都是显示一样的(这个不理解,parent不起作用的?)。