使用View
衡量view.measure()
常量维度后,getMeasuredHeight()
和getMeasureWidth()
返回0。
layout_view.xml ,为了创建视图而膨胀的布局
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="100dp"
android:layout_height="100dp">
</FrameLayout>
测量尺寸的功能
public void measureView(Context context){
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.layout_view,null,false);
view.measure( View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
Log.d(TAG,"Error width : " + view.getMeasuredWidth());
Log.d(TAG,"Error heeght : " + view.getMeasuredHeight());
}
答案 0 :(得分:9)
当您在view.getMeasuredWidth()
或onCreate()
中致电onCreateView()
时,尚未提取view
。因此,您需要添加一个侦听器,并在绘制view
时获得回调。就像在我的代码中一样:
final ViewTreeObserver vto = view.getViewTreeObserver();
if (vto.isAlive()) {
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int viewWidth = view.getMeasuredWidth();
// handle viewWidth here...
if (Build.VERSION.SDK_INT < 16) {
vto.removeGlobalOnLayoutListener(this);
} else {
vto.removeOnGlobalLayoutListener(this);
}
}
});
}
注意:删除侦听器以获得更好的性能!
请勿调用vto.removeOnGlobalLayoutListener(this)
删除侦听器。这样称呼:
vto.getViewTreeObserver()
答案 1 :(得分:4)
您是否在onCreate()
中测量视图。该视图尚未绘制。您必须等到视图绘制后的时间才能进行测量。
简单的解决方案是将runnable发布到布局。布局发生后将执行runnable。
了解更多信息See this post
修改强> 试着改变
view.measure( View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
到
view.measure( View.MeasureSpec.EXACTLY, View.MeasureSpec.EXACTLY);
答案 2 :(得分:3)
请尝试这种方式,希望这有助于您解决问题。
view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int width = view.getMeasuredWidth();
int height = view.getMeasuredHeight();
}
});
答案 3 :(得分:1)
如果您的测量视图的可见性设置为已消失,则测量将返回0.您可以将其设置为可见,测量,然后设置回去,全部来自代码。
答案 4 :(得分:0)
您无法在View.MeasureSpec.*
电话中直接使用measure
。而是首先makeMeasureSpec()
然后使用它来调用measure()
:
final int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(ViewGroup.LayoutParams.WRAP_CONTENT/*can be match_parent or some exact value*/, View.MeasureSpec.UNSPECIFIED);
final int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(ViewGroup.LayoutParams.WRAP_CONTENT/*can be match_parent or some exact value*/, View.MeasureSpec.UNSPECIFIED);
view.measure(widthMeasureSpec, heightMeasureSpec);
答案 5 :(得分:0)
以防万一有人在使用ImageView时遇到此问题:
我注意到如果你的ImageView没有&#34; android:src&#34; set(即你动态改变它)它总是从getMeasuredWidth / Height返回零。
一个简单的解决方法是为视图设置占位符。
答案 6 :(得分:0)
在onCreateView()/onViewCreated()
中,您可以使用:
view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED)
然后致电view.control.measuredWidth
。
在诸如onClick()
这样的其他事件中(当视图可见并已测量时),您可以像在{{中一样,直接调用view.control.measuredWidth
(不使用view.measure(...)
)或使用getViewTreeObserver
3}}。