我想在使用前测量一些布局的高度(在recyclerview中)。所有布局都有wrap_content大小或特定的dp设置(即不依赖于父视图)。
我做了如下功能。 它适用于纯粹的wrap_content大小的布局,并且没有任何已定义大小的布局(即所有wrap_content)
private float measureViewHeight(int resource) {
View view = getLayoutInflater(null).inflate(resource, null);
view.measure(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
return (float) view.getMeasuredHeight();
}
但是如果布局包含一些定义了特定dp高度的布局,则测量返回不是不准确的。我该如何修复我的函数,以便返回正确的值?
更新 有了@shhp的答案,并且还修复了prelollipop崩溃...更新的答案将使用以下
private float measureViewHeight(int resource) {
View view = getLayoutInflater(null).inflate(resource, null);
view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
return (float) view.getMeasuredHeight();
}
答案 0 :(得分:1)
View.measure
的参数具有特殊含义,您应拨打MeasureSpec.makeMeasureSpec
以获取参数。
替换
view.measure(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
带
view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
答案 1 :(得分:0)
尝试使用
view.post(new Runnable() {
@Override
public void run() {
}
});
当视图布局时,runnable将运行,并且应该给出正确的测量值。
此外,您不需要在measure方法中再次膨胀视图。你在浪费资源,这是不好的做法。