在初始化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);
大家可以把动态计算方法封装成工具方法调用