Как изменить размер представления в зависимости от размера его родительского макета. Например, у меня есть RelativeLayout
окно, заполняющее весь экран, и я хочу, чтобы дочерний вид, скажем ImageView
, занимал всю высоту и 1/2 ширины?
Я пытался перекрывая все на onMeasure
, onLayout
, onSizeChanged
и т.д. , и я не мог заставить его работать ....
Ответы:
Я не знаю, читает ли кто-нибудь все еще эту ветку или нет, но решение Джеффа поможет вам только на полпути (буквально). Его onMeasure будет отображать половину изображения на половине родительского. Проблема в том, что вызов super.onMeasure до метода
setMeasuredDimension
будет измерять все дочерние элементы в представлении на основе исходного размера, а затем просто разрезать вид пополам приsetMeasuredDimension
изменении его размера.Вместо этого вам нужно вызвать
setMeasuredDimension
(как требуется для переопределения onMeasure) и предоставить новыйLayoutParams
для вашего представления, а затем вызватьsuper.onMeasure
. Помните, что вашиLayoutParams
являются производными от родительского типа вашего представления, а не от типа вашего представления.Я считаю, что проблемы с родителем
LayoutParams
могут возникнуть только в том случае, если родитель является объектомAbsoluteLayout
(который устарел, но все же иногда полезен).источник
MeasureSpec.getSize(widthMeasureSpec)
Действительно ли дает правильную родительскую ширину? Для меня он просто возвращает случайную ширину, которая довольно близка к фактической, но не точна.wrap_content
не годится. Ответ Вика не работает для этого сценария, но комментарий @M.Schenk работает. Это также экономит дополнительный проход макета. Вы также должны опубликовать его в качестве ответа для наглядности.super.onMeasure()
просто не переопределит и не сведет на нет эффекты предыдущего вызоваthis.setMeasuredDimension()
?super.onMeasure()
не отменяет более ранние вычисления.Вы можете решить эту проблему, создав пользовательский View и переопределив метод onMeasure (). Если вы всегда используете «fill_parent» для layout_width в вашем xml, тогда параметр widthMeasureSpec, который передается в метод onMeasusre (), должен содержать ширину родительского элемента.
Ваш XML будет выглядеть примерно так:
источник
Я обнаружил, что лучше не возиться с установкой измеренных размеров самостоятельно. На самом деле между родительским и дочерним представлениями происходят небольшие переговоры, и вы не хотите переписывать весь этот код .
Однако вы можете изменить параметры measureSpec, а затем вызвать super с ними. Ваше представление никогда не узнает, что оно получает измененное сообщение от своего родителя, и позаботится обо всем за вас:
источник
Когда вы определяете макет и представление в XML, вы можете указать ширину и высоту макета представления, чтобы либо обернуть содержимое, либо заполнить родительским. Занять половину площади немного сложнее, но если у вас есть что-то, что вы хотите на другой половине, вы можете сделать что-то вроде следующего.
Придание двум вещам одинакового веса означает, что они будут растягиваться, занимая одинаковую часть экрана. Дополнительные сведения о макетах см. В документации для разработчиков.
источник
Я считаю, что XML-подход Mayras может пригодиться . Однако можно сделать его более точным, только с одним представлением, установив weightSum. Я бы больше не назвал это взломом, но, на мой взгляд, это наиболее простой подход:
Таким образом, вы можете использовать любой вес, например 0,6 (и центрирование) - это вес, который я люблю использовать для кнопок.
источник
Попробуй это
то вы можете использовать LinearLayout.LayoutParams для установки параметров chileView
источник
Теперь вы можете использовать PercentRelativeLayout. Бум! Задача решена.
источник
Роман, если вы хотите сделать свой макет в Java-коде (потомок ViewGroup), то это возможно. Хитрость в том, что вам нужно реализовать как методы onMeasure, так и onLayout. Сначала вызывается onMeasure, и вам нужно там «измерить» подпредставление (по сути, установить его размер до желаемого значения). Вам нужно снова изменить его размер в вызове onLayout. Если вы не выполните эту последовательность или не вызовете setMeasuredDimension () в конце кода onMeasure, вы не получите результатов. Почему это так сложно и хрупко, я не понимаю.
источник
Если другая сторона пуста. Я предполагаю, что самым простым способом было бы добавить пустое представление (например, линейный макет), затем установить ширину обоих представлений на fill_parent и их веса на 1.
Это работает в LinearLayout ...
источник
Это примерно так:
источник
Я долго боролся с этим вопросом, я хочу изменить ширину ящика DrawerLayout, который является вторым дочерним элементом его родителя. Недавно разобрался, но не знаю, есть ли идея получше.
источник