GetWidth () и getHeight () всегда возвращает 0. Пользовательский вид

В фрагменте я раздуваю макет с несколькими дочерними представлениями. Мне нужно получить размеры (ширину и высоту) одного из них, который является обычным представлением.

Внутри класса пользовательского вида я могу сделать это легко. Но если я попытаюсь сделать это из фрагмента, я всегда получаю 0 в качестве измерений.

public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); View culoide = view.findViewWithTag(DRAW_AREA_TAG); Log.d("event", "culoide is: "+culoide.getWidth()); // always 0 } 

Я полагаю, что onViewCreated должен быть правильным местом для его получения, но это хорошо. Я пробовал, прежде чем super.onViewCreated, в отладке выглядит так: «findViewWithTag» находит правильное представление, пробовал только с поддержкой api 7 v4.

Любая помощь?

Solutions Collecting From Web of "GetWidth () и getHeight () всегда возвращает 0. Пользовательский вид"

Вы должны подождать, пока после первого измерения и макета, чтобы получить ненулевые значения для getWidth() и getHeight() . Вы можете сделать это с помощью ViewTreeObserver.OnGlobalLayouListener

 public void onViewCreated(final View view, Bundle saved) { super.onViewCreated(view, saved); view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { public void onGlobalLayout() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { view.getViewTreeObserver().removeOnGlobalLayoutListener(this); } else { view.getViewTreeObserver().removeGlobalOnLayoutListener(this); } // get width and height of the view } }); } 

Мой предпочтительный метод заключается в том, чтобы добавить OnLayoutChangeListener в представление, которое вы хотите отслеживать самостоятельно

 CustomView customView = ... customView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { // Make changes } }); 

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

Попробуйте позвонить

culoide.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);

Сначала попробуйте getWidth() и getHeight()

Вам нужно подождать, пока не вызывается метод onSizeChanged (), прежде чем вы сможете надежно определить размер представления.

Это называется во время компоновки, когда размер этого вида изменился. Если вы просто добавлены в иерархию представлений, вы вызываетесь со старыми значениями 0.

Попробуйте проверить onWindowFocusChanged и он должен иметь допустимые значения:

 public void onWindowFocusChanged (boolean hasFocus) { } 

У меня была аналогичная проблема, когда мне нужно было получить ширину и высоту виджета, и это была функция, в которой я мог гарантировать, что виджет сообщил, что это правильный размер.