Почему вызов getWidth() для View в onResume() возвращает 0?
Все, что я прочитал, говорит, что ты не можешь позвонить getWidth()
или же getHeight()
на View
в конструкторе, но я звоню им в onResume()
, Разве экран не должен быть нарисован к тому времени?
@Override
protected void onResume() {
super.onResume();
populateData();
}
private void populateData() {
LinearLayout test = (LinearLayout) findViewById(R.id.myview);
double widthpx = test.getWidth();
}
3 ответа
Вид еще не был нарисован, когда onResume()
называется, поэтому его ширина и высота равны 0. Вы можете "поймать", когда его размер изменяется с помощью OnGlobalLayoutListener()
:
yourView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// Removing layout listener to avoid multiple calls
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
yourView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
else {
yourView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
populateData();
}
});
Для получения дополнительной информации взгляните на Android получить ширину возвращает 0.
Вы должны подождать, что иерархия текущего представления по крайней мере измеряется, прежде чем getWidth
а также getHeigth
вернуть что-то!= 0. Что вы можете сделать, это получить "корневой" макет и опубликовать работоспособный. Внутри runnable вы должны быть в состоянии получить ширину и высоту успешно
root.post(new Runnable() {
public void run() {
LinearLayout test = (LinearLayout) findViewById(R.id.myview);
double widthpx = test.getWidth();
}
});
Как говорилось в предыдущем ответе, ваш взгляд еще не измерен. Взгляните на расширения Android KTX — Kotlin для Jetpack, особенно на это:
View.doOnLayout((view: View) -> Unit)?)
Эта функция расширения гарантирует, что предоставленное действие будет выполнено после размещения представления или, если оно уже было размещено, оно будет вызвано немедленно.
В этой статье подробно объясняется, как измеряются, укладываются и рисуются представления, а также что вы, как разработчик, можете сделать, чтобы получить правильный размер вашего представления. Это также касается обычно рекомендуемых решений, таких как
View.post()
и регистрация
OnGlobalLayoutListener
и объясняет, что может пойти не так при их использовании.
https://cheesecakelabs.com/blog/understanding-android-views-dimensions-set/