Getmeasuredheight () и getmeasuredwidth () возвращает 0 после View.measure ()

После измерения 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()); } 

Solutions Collecting From Web of "Getmeasuredheight () и getmeasuredwidth () возвращает 0 после View.measure ()"

Когда вы вызываете view.getMeasuredWidth() в onCreate() или onCreateView() , view еще не нарисовано. Поэтому вам нужно добавить слушателя и получить обратный вызов при view представления. Как и в моем коде:

 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) { v.getViewTreeObserver().removeGlobalOnLayoutListener(this); } else { v.getViewTreeObserver().removeOnGlobalLayoutListener(this); } } }); } 

ПРИМЕЧАНИЕ. Снимите прослушиватель для лучшей производительности!

Не вызывайте vto.removeOnGlobalLayoutListener(this) чтобы удалить слушателя. Назовите это так:

 v.getViewTreeObserver() 

Вы измеряете представление в onCreate() . Представление еще не нарисовано. Вы должны подождать до тех пор, пока изображение не будет нарисовано, прежде чем вы сможете его измерить.

Простое решение для этого – отправить runnable в макет. Исполняемый файл будет выполнен после выполнения макета.

Для получения дополнительной информации

Изменить попробуйте изменить

 view.measure( View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); 

в

 view.measure( View.MeasureSpec.EXACTLY, View.MeasureSpec.EXACTLY); 

Попробуйте этот путь, надеюсь, что это поможет вам решить вашу проблему.

 view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int width = view.getMeasuredWidth(); int height = view.getMeasuredHeight(); } }); 

Если ваш измеренный вид имеет видимость, установленную для удаления, измерение вернет 0. Вы можете установить его на видимое, измерить, а затем вернуть обратно, все из кода.

Вы не можете использовать эти параметры при вызове 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); 

На всякий случай кто-то сталкивался с этой проблемой с ImageView:

Я заметил, что если ваш ImageView не имеет набора «android: src» (т. Е. Вы меняете его динамически), он всегда будет возвращать ноль из getMeasuredWidth / Height.

Простым обходным решением было бы установить местозаполнитель для просмотра.