Почему новые размеры View не выводятся через Log? Вместо них выводятся старые значения, но при этом UI на устройстве запуска показывается правильно
textView2.post(new Runnable() {
@Override
public void run() {
viewWidth = textView2.getWidth();
viewHeight = textView2.getHeight();
Log.i("userTest2020", String.valueOf("5) view width = "+viewWidth+"\n"+"view height = "+viewHeight));
textView2.setLayoutParams(new LinearLayout.LayoutParams(
800,400));
viewWidth = textView2.getWidth();
viewHeight = textView2.getHeight();
Log.i("userTest2020", String.valueOf("4.4) view width = "+viewWidth+"\n"+"view height = "+viewHeight));
};
});
Console Result
2020-03-31 07:28:09.327 7049-7049/? I/userTest2020: 5) view width = 400
view height = 200
2020-03-31 07:28:09.327 7049-7049/? I/userTest2020: 4.4) view width = 400
view height = 200
Ответы (1 шт):
Автор решения: Alex_Skvortsov
→ Ссылка
Размеры всех View пересчитываются системой в цикле, Ваш код вызывается в том же потоке, как бы между перерисовками. Получается, что команда
textView2.setLayoutParams(new LinearLayout.LayoutParams(800,400));
Не изменяет размеры View, а только требует их изменения при перерисовке. Перерисовка происходит с огромной частотой, однако несколько последовательных строк кода почти всегда будут вызываться без перерисовки между ними. Выходит, что
viewWidth = textView2.getWidth();
viewHeight = textView2.getHeight();
Вызывается до перерисовки, когда View еще не пересчитал размеры.
Если Вам необходимо все-таки получить новые реальные размеры View, то единственный известный мне способ - использовать ViewTreeObserver.OnGlobalLayoutListener