Когда измерения View станут доступны для MainActivity? - PullRequest
0 голосов
/ 22 сентября 2018

Допустим, у нас есть макет main_activity.xml, который определяет все измерения относительным образом - ограничения, проценты и рекомендации (которые являются процентами) ... нет "статического" дп.

Но вMainActivity.java, мы программно создаем некоторые подпредставления, и мы хотим определить их размеры по высоте / ширине относительно существующих видов.

Мы не знаем размеров или плотности устройства, поэтому также не знаем(фактические целочисленные) размеры любого представления до времени выполнения ...

Но мы можем сказать что-то вроде:

int heightDimensionForNewView = (int) (someAlreadyInflatedView.getHeight() / 7f)

Но что, если при определенных обстоятельствах эти«новые» представления должны отображаться сразу во время запуска приложения?

Итак, вопрос:

В жизненном цикле Android Activity, когда это самое раннееточка, в которой вы можете (как-то) безопасно запросить (что-то) фактические / окончательные / гарантированные размеры макета?И что это за что-то и как-то?

Мне не удалось найти метод переопределения, такой как "onContentViewInflated ()", и нет метода onCreateView (), как в Fragment.

Я также пытался вести лог изнутри onStart () и onResume (), но результаты измерений всегда равны «0», предположительно, потому что они еще не были завышены.

Я знаю, что любойданный View может получать свои собственные измерения в onMeasure (), но тогда вам нужно будет создать статическую переменную в MainActivity, чтобы назначить ее и использовать оттуда ... или каким-либо способом отправить эту информацию из View обратно в Activity.

Чего мне не хватает?Я просто хочу иметь возможность каким-то образом получить номер из самой MainActivity.

1 Ответ

0 голосов
/ 22 сентября 2018

Мои предложения:

view.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
    @Override
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
        int oldWidth = oldRight - oldLeft; // right exclusive, left inclusive
        if( v.getWidth() != oldWidth ) {
            // width has changed
        }
    }
});

и

view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        // View has laid out

        // Remove the layout observer if you don't need it anymore
        view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...