在初始化Popwindow的時候,除了給定contentView還需要給定Window顯示的寬和高。所以我們一般在初始化PopWindow給定寬高,都是定死寬和高。而我們最理想的情況下是根據contentView的寬和高來定popWindow,然而此時我們只是通過inflate填充出View樹,此時並不知道它的高度。
研究過View的繪製流程的人都知道ViewRootImpl的內部函式performTraversals(),進行measure,layout,draw流程。現在我們只需要提前measure,測量出ContentView的寬和高就行了,而剩下的難度就是如何計算了。以下就是我給出的如何手動測量的程式碼。
//獲取當前Activity的Window的decorView作為測量的父佈局
FrameLayout decorView = (FrameLayout) activity.getWindow().getDecorView();
//填充獲得自己的popwindow的contentView
View contentView = LayoutInflater.from(view.getContext()).inflate(R.layout.dialog_share_knownlege_alert, decorView,false);
//構造父類的withSpec和heightSpec
int withSpec = View.MeasureSpec.makeMeasureSpec(decorView.getMeasuredWidth(), View.MeasureSpec.AT_MOST);
int heightSpec = View.MeasureSpec.makeMeasureSpec(decorView.getMeasuredHeight(), View.MeasureSpec.AT_MOST);
//真正的提前計算內容高度
contentView.measure(withSpec, heightSpec);
//設定PopWindow的contentView的計算得出的實際高度
final PopupWindow popupWindow = new PopupWindow(contentView, LinearLayout.LayoutParams.MATCH_PARENT,contentView.getLayoutParams().height);
複製程式碼
大家可以把動態計算方法封裝成工具方法呼叫