Почему вызов 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)?)

Эта функция расширения гарантирует, что предоставленное действие будет выполнено после размещения представления или, если оно уже было размещено, оно будет вызвано немедленно.

https://developer.android.com/reference/kotlin/androidx/core/view/package-summary#(android.view.View).doOnLayout(kotlin.Function1)

В этой статье подробно объясняется, как измеряются, укладываются и рисуются представления, а также что вы, как разработчик, можете сделать, чтобы получить правильный размер вашего представления. Это также касается обычно рекомендуемых решений, таких как View.post()и регистрация OnGlobalLayoutListenerи объясняет, что может пойти не так при их использовании.

https://cheesecakelabs.com/blog/understanding-android-views-dimensions-set/

Другие вопросы по тегам