Android ViewFlipper измеряет недисписанного ребенка - PullRequest
1 голос
/ 17 мая 2011

У меня есть ViewFlipper в представлении моей основной деятельности.В onCreate я создаю экземпляры Views, которые добавляются в ViewFlipper.После этого я установил отображаемый дочерний элемент на первый.И когда кнопка нажата, я переключаю дочерний экран ViewFlipper на второй вид.Сразу после вызова viewFlipper.setDisplayedChild(1) мне нужно выполнить некоторые вычисления и создать несколько объектов, основанных на ширине и высоте отображаемого дочернего элемента.

Основная проблема здесь заключается в том, что в первый раз (второй = 1) дочерний элемент отображает измерениезрения еще не сделано.Так что мои ширина и рост равны 0. Если я вернусь (setDisplayedChild(0)) и затем вернусь ко второму ребенку, то все в порядке (ширина и высота верны).

Я провел некоторое исследование об этом поведениипросмотрел и обнаружил, что существует метод [onMeasure] (http://developer.android.com/reference/android/view/View.html#onMeasure(int, int)), который можно переопределить, и все можно сделать здесь.ОК, так и должно быть.На самом деле, но проблема в том, что onMeasure вызывается 4 раза при каждом переключении вида.И мои выводы заключались в том, что на первом и третьем вызовы ширина и высота являются полноэкранными.Второй и четвертый вызовы - правильная ширина и высота.Поскольку я должен создавать новые объекты в этой точке, неразумно делать это в onMeasure.

Есть ли какой-то другой, правильный способ сделать это?Можно ли форсировать измерения?Мне действительно нужно показывать изображение на экране для измерений?

С уважением, Zmeda

1 Ответ

3 голосов
/ 17 мая 2011

Ваше init-действие (основанное на ширине и высоте отображаемого дочернего элемента) должно вызываться после измерения дочерних элементов ViewFlipper, этого можно добиться с помощью метода post, например:

    viewFlipper.setDisplayedChild(1);

    viewFlipper.post(new Runnable() {
        @Override
        public void run() {
            Log.d("test", "w: " + viewFlipper.getCurrentView().getWidth());// not 0
            //do some calculations and instantate some objects
        }
    });
...