измерение представления перед его рендерингом

Мне нужно выяснить, насколько большой будет представление после присоединения к его родительскому объекту.

Я переопределил этот метод:

onMeasure(int, int); 

но похоже, что этот метод вызывается только тогда, когда я фактически добавляю свой пользовательский вид в его контейнер, используя:

 addView(myView); 

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

кто-нибудь?

Если вы хотите получить ширину и высоту до того, как ваша активность добавит ее в свою иерархию представлений, ее measure() и выложите, вам нужно будет вызвать measure() в View getMeasuredWidth() перед вызовом getMeasuredWidth() или getMeasuredHeight() .

Поскольку измеренная ширина и высота задаются после вызова onMeasure() которая в свою очередь вызывает onMeasure() ), они возвращают 0 до этой точки. Вам необходимо будет указать MeasureSpec для measure(..) который будет зависеть от ваших потребностей.

MeasureSpecs, которые позволяют детям самим навязывать какие-либо ограничения, выглядят так:

 int widthMeasureSpec = MeasureSpec.makeMeasureSpec(*some width*, MeasureSpec.EXACTLY); int heightMeasureSpec = MeasureSpec.makeMeasureSpec(*some height*, MeasureSpec.EXACTLY); 

Важный момент . (был изменен в новом API) . Ширина, ViewGroup.LayoutParams.WRAP_CONTENT выше, может быть либо явной px, либо ViewGroup.LayoutParams.WRAP_CONTENT или ViewGroup.LayoutParams.FILL_PARENT.

Также стоит отметить, когда ваше мнение измеряется в фактической целевой иерархии, MeasureSpec, который будет передан в measure() будет сконфигурирован на основе логики компоновки ViewGroups . Он может быть вызван более одного раза, если первые меры vals недействительны при рассмотрении в контексте этого родительского представленияGroup / его собственных ограничений компоновки / ограничений любого дочернего представления sibling. Не дожидаясь, пока viewGroup вызовет measure() прежде чем реализовать какую-либо логику, зависящую от измеренного размера, было бы сложно (в зависимости от ситуации) получить окончательную measuredWidth & height из вышеупомянутого решения, но во всех случаях я использовал выше техники, она соответствует цели, но они были относительно просты. Если вам действительно нужно измерять в контексте, вы должны, вероятно, просто сделать это после того, как onLayout() вернулась и явно установила любые изменения, а затем requestLayout() снова.

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

Это из документации SDK:

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

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

После макета вы можете вызвать getWidth () и getHeight (), чтобы найти конечный размер вашего пользовательского представления.

Вы должны иметь возможность использовать getMesauredWith () и getMeasuredHeight ()

http://developer.android.com/reference/android/view/View.html#getMeasuredWidth%28%29

У меня такая же проблема. Я предполагаю, что единственный способ – сделать его первым, а затем удалить его, если он соответствует условию размера. Кажется немного странным, но Android, похоже, знает размеры после рисования.

  • Редактор макета Android ConstraintLayout
  • Точная процедура добавления «jfeinstein10 / SlidingMenu» в проект Android
  • ListSelector применяется ко всему списку
  • Ссылка должна быть открыта в том же веб-браузере в Android
  • Как скопировать вывод logcat в буфер обмена?
  • java.lang.NoClassDefFoundError: android / graphics / drawable / Icon
  • Как выйти из приложения Android с помощью кода?
  • Как закрыть приложение для Android?
  • Показать текущее местоположение внутри fragmentа карты Google
  • Как получить несколько значков для запуска различных действий в одном приложении?
  • Как рисовать границу только на одной стороне линейного макета?
  • Давайте будем гением компьютера.