Другие решения не являются исчерпывающими.В некоторых случаях они могут работать, и с них можно начинать, но они не гарантированно работают.
Когда вызывается onMeasure, вы можете иметь или не иметь права изменять размер.Значения, которые передаются вашему onMeasure (widthMeasureSpec
, heightMeasureSpec
), содержат информацию о том, что разрешено делать вашему дочернему представлению.В настоящее время есть три значения:
MeasureSpec.UNSPECIFIED
- Вы можете быть такими большими, как вам хотелось бы MeasureSpec.AT_MOST
- такими большими, как вы хотите (до размера спецификации), Это parentWidth
в вашем примере. MeasureSpec.EXACTLY
- Нет выбора.Родитель выбрал.
Это сделано для того, чтобы Android мог сделать несколько проходов, чтобы найти правильный размер для каждого элемента, подробнее см. здесь .
Если вы не будете следовать этим правилам, ваш подход не гарантированно сработает.
Например, если вы хотите проверить, разрешено ли вообще изменять размер, вы можете выполнитьследующее:
final int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
final int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
boolean resizeWidth = widthSpecMode != MeasureSpec.EXACTLY;
boolean resizeHeight = heightSpecMode != MeasureSpec.EXACTLY;
Используя эту информацию, вы узнаете, можете ли вы изменить значения, как в вашем коде.Или если вам нужно сделать что-то другое.Быстрый и простой способ определить желаемый размер - использовать один из следующих методов:
int resolSizeAndState (int size, int measureSpec, int childMeasuredState)
int resolSize (int size, int measureSpec)
Хотя первое доступно только в Honeycomb, второе доступно во всех версиях.
Примечание. Вы можете обнаружить, что resizeWidth
или resizeHeight
всегда ложны.Я обнаружил, что это тот случай, когда я запрашивал MATCH_PARENT
.Я смог исправить это, запросив WRAP_CONTENT
на моем родительском макете, а затем на этапе НЕУТОЧЕННЫЙ запросить размер Integer.MAX_VALUE
.Это дает вам максимальный размер, который ваш родитель разрешает при следующем прохождении через onMeasure.