Я обычно делаю такие вещи:
View v; // the view i want to layout squared
v.measure(1,1);
int size = v.getMeasuredHeight(); // or v.getMeasuredWidth()...
LayoutParams params = ... // either your own, or returned from View
params.width = size;
params.height = size;
v.setLayoutParams(params);
Это, конечно, не самый сложный код, так как он оставляет большинство возможностей, которые могут быть использованы в MeasureSpec, но он выполняет свою работу, так как v.measure (1,1) просто говорит: «Измерьте мой взгляд как есть!».
Абсолютным плюсом в моем подходе является то, что вам не нужно ничего делать подклассом, и вам не нужно добавлять OnGlobalLayoutListener
к вашему ViewTreeObserver
. Все это работает в том месте, где вы строите или раздуваете свой макет в коде.