Android自定義PopupWindow顯示在控件上方或者下方


記錄學習之用  

View view = mInflater.inflate(R.layout.layout_popupwindow, null);
PopUpwindowLayout popUpwindowLayout = (PopUpwindowLayout) view.findViewById(R.id.llayout_popupwindow);
popUpwindowLayout.initViews(mContext, titles, false);
final PopupWindow popupWindow = new PopupWindow(view, LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
 //測量view 注意這里,如果沒有測量  ,下面的popupHeight高度為-2  ,因為LinearLayout.LayoutParams.WRAP_CONTENT這句自適應造成的
view.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);   
int popupWidth = view.getMeasuredWidth();    //  獲取測量后的寬度
int popupHeight = view.getMeasuredHeight();  //獲取測量后的高度
int[] location = new int[2];
// 允許點擊外部消失
popupWindow.setBackgroundDrawable(new BitmapDrawable());//注意這里如果不設置,下面的setOutsideTouchable(true);允許點擊外部消失會失效
popupWindow.setOutsideTouchable(true);   //設置外部點擊關閉ppw窗口
popupWindow.setFocusable(true);
// 獲得位置 這里的v是目標控件,就是你要放在這個v的上面還是下面
v.getLocationOnScreen(location);
popupWindow.setAnimationStyle(R.style.mypopwindow_anim_style);  //設置動畫
//這里就可自定義在上方和下方了 ,這種方式是為了確定在某個位置,某個控件的左邊,右邊,上邊,下邊都可以 popupWindow.showAtLocation(v, Gravity.NO_GRAVITY, (location[
0] + v.getWidth() / 2) - popupWidth / 2, location[1] - popupHeight);

//因為ppw提供了在某個控件下方的方法,所以有些時候需要直接定位在下方時並不用上面的這個方法
ppwfilter.showAsDropDown(v); // 以觸發彈出窗的view為基准,出現在view的正下方,彈出的pop_view左上角正對view的左下角  偏移量默認為0,0
ppwfilter.showAsDropDown(v, xoff, yoff); // 有參數的話,就是一view的左下角進行偏移,xoff正的向左,負的向右. yoff沒測,也應該是正的向下,負的向上
ppwfilter.showAsDropDown(parent, xoff, yoff, gravity) //parent:傳你當前Layout的id; gravity:Gravity.BOTTOM(以屏幕左下角為參照)... 偏移量會以它為基准點 當x y為0,0是出現在底部居中 


注意:在安卓7.0上請看下面要注意的地方
/**
* 在android7.0上,如果不主動約束PopuWindow的大小,比如,設置布局大小為 MATCH_PARENT,那么PopuWindow會變得盡可能大,以至於 view下方無空間完全顯示PopuWindow,而且view又無法向上滾動,此時PopuWindow會主動上移位置,直到可以顯示完全。
* 解決辦法:主動約束PopuWindow的內容大小,重寫showAsDropDown方法:
* @param anchor
*/
@Override
public void showAsDropDown(View anchor) {
if(Build.VERSION.SDK_INT >= 24){
Rect visibleFrame = new Rect();
anchor.getGlobalVisibleRect(visibleFrame);
int height = anchor.getResources().getDisplayMetrics().heightPixels - visibleFrame.bottom;
setHeight(height);
}
super.showAsDropDown(anchor);
}


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM