Предыдущая версия моего вопроса была слишком многословной. Люди не могли понять это, поэтому следующее полное переписывание. См. edit history, если вас интересует старая версия.Пользовательский вид onMeasure: как получить ширину по высоте
RelativeLayout
родителя отправляет MeasureSpec
s к onMeasure
методе своего дочернего зрения для того, чтобы увидеть, как большой ребенок хотел бы быть. Это происходит в нескольких проходах.
Мой заказ вид
У меня есть custom view. По мере увеличения содержания представления увеличивается высота представления. Когда представление достигает максимальной высоты, которую разрешает родитель, ширина представления увеличивается для любого дополнительного содержимого (если для ширины выбрано wrap_content
). Таким образом, ширина пользовательского представления напрямую зависит от того, какой родитель говорит, что максимальная высота должна быть.
An (несогласованный) родитель ребенка разговор
onMeasure
проход 1
RelativeLayout
родитель говорит мой взгляд, «Вы можете быть любой ширины up to900
и любой высоты up to600
. Что ты говоришь?"
мой взгляд говорит: «Ну, на такой высоте, я могу поместить все с шириной 100
. Так что я возьму ширину 100
и высоту 600
.»
onMeasure
проход 2
RelativeLayout
родитель говорит мой взгляд, «Вы сказали мне в прошлый раз, что вы хотели ширину 100
, поэтому давайте установим, что в качестве exact ширины. Теперь, на основании этой ширины, какую высоту вы хотели бы? Ничего up to500
в порядке. "
"Эй!" мой взгляд отвечает. «Если вы только даете мне максимум высоты 500
, то 100
слишком узкий. Мне нужна ширина 200
для этой высоты. Но хорошо, сделайте это по-своему. Я не нарушу правила (еще .. .). Я возьму ширину 100
и высоту 500
. "
Окончательный результат
RelativeLayout
родитель назначает окончательный вид размером 100
для ширины и 500
на высоте. Это, конечно, слишком узко для просмотра, и часть содержимого обрезается.
«Вздох», - думает мой взгляд. «Почему мой родитель не позволит мне быть шире? Существует много места. Может быть, кто-то из Stack Overflow может дать мне несколько советов."
Я думаю, что его вопрос о ваших единиц, пожалуйста, рассмотреть возможность использования только одной единицы дп или точек в ширину и высоту. – Mohamed
@Mohamed, Мой пример здесь использует только px. – Suragch
Когда я использую ваш пользовательский вид внутри LinearLayout, он работает нормально. Вы попробовали это? – Krish