如果父级是PopupWindow而不是ViewGroup,如何计算膨胀视图的宽度和高度?我不能使用LayoutInflator.inflate(int resId, ViewGroup parent, attachToRoot boolean)
,因为PopupWindow不是ViewGroup,所以我使用LayoutInflator.inflate(int resId)
代替,但之后我getWidth()和getHeight()返回零:(
我需要调整PopupWindow的大小以适应View,但是在View有父级之前不能这样做。我有鸡蛋问题吗?
顺便说一下,View是RelativeView的子类,因此手动计算它基本上是不可能的。
提前致谢, 百里
答案 0 :(得分:18)
实际上popupWindow支持“换行内容”constans,所以如果你想让弹出窗口与你的视图完全一致 - 请使用:
popup = new PopupWindow(context);
popup.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
popup.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
- 其他选项 -
getWidth()
和getHeight()
返回零,因为只有在屏幕上绘图后视图才有大小。您可以尝试从LayoutParams
的充气视图中获取值。
如果有fill_parent
值 - 你处于鸡蛋状态。
如果px
或dp
中有值,您可以手动计算像素大小:
Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpSize, context.getResources().getDisplayMetrics()));
如果有wrap_content
值 - 您可以使用view.measure()
方法 - 所有子项和视图本身都会被衡量,您可以获得view.getMeasuredHeight()
和view.getMeasuredWidth()
。
答案 1 :(得分:7)
正如Jin35所说,你的问题是视图的宽度和高度尚未计算......尺寸直到布局通过后才计算。
使用维度资源的固定宽度和高度(例如,来自值/ dimens.xml文件)是一种解决方法,从那时起您无需等待视图的onMeasure发生 - 您可以获得值您用于您感兴趣的视图的相同维度资源,并使用它。
更好的解决方案是延迟计算,直到onMeasure发生。你可以通过覆盖onMeasure来做到这一点,但更优雅的解决方案是使用这样的临时OnGlobalLayoutListener:
View popup = LayoutInflator.inflate(int resId);
if(popup != null) {
// set up an observer that will be called once the listView's layout is ready
android.view.ViewTreeObserver viewTreeObserver = listView.getViewTreeObserver();
if (viewTreeObserver.isAlive()) {
viewTreeObserver.addOnGlobalLayoutListener(new android.view.ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// This will be called once the layout is finished, prior to displaying.
View popup = findViewById(resId);
if(popup != null) {
int width = popup.getMeasuredWidth();
int height = popup.getMeasuredHeight();
// don't need the listener any more
popup.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
}
});
}
}
答案 2 :(得分:-3)
请试试这个:
Display display = getWindowManager().getDefaultDisplay();
Log.e("", "" + display.getHeight() + " " + display.getWidth());