Изменение размера кнопки с ViewTreeObserver в первый раз работает странно - PullRequest
0 голосов
/ 15 мая 2019

Я работаю с Android Kotlin и я делаю калькулятор, он имеет два разных режима: арифметический и нормальный. Я контролирую это с помощью переключателя, если установлен флажок, он находится в арифметическом режиме, если нет, то в обычном режиме.

У меня есть алгоритм изменения размера кнопок для всех устройств, я выполняю его в viewTreeObserver и показываю / скрываю некоторые кнопки в зависимости от режима калькулятора.

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

Изображение FirstExecution

Изменение режима изображения

После изменения конфигурации (GoodResizing) Изображение

Я пытался сделать некоторую отладку, но она утомительна из-за многократных вызовов viewTreeObserver

Также алгоритм изменения размера всегда возвращает один и тот же множитель для двух разных случаев (нормальный и арифметический)

Здесь я использую viewTreeObserver:

override fun onStart() {
        if (view!!.viewTreeObserver.isAlive){
            view!!.viewTreeObserver.addOnPreDrawListener {
                calculatorPresenter.setCalculatorModeInView()
                changeTypeFaceCalculator()
                changeSizeButtons(findButtonSize(viewInf))

                true
            }
        }
        super.onStart()

    }

это алгоритм изменения размера кнопок, он получает контейнер и возвращает двойное число, чтобы умножить его на измеренное с:

override fun findButtonSize(viewCalculadora: View?): Double {
        //1. Por defecto planteamos que el alto debe
        //   ser el mismo que el ancho (aspect 1:1 o sea 1)

        var multiplierPropuesto = 1.0

        //2. Calculamos el ancho de las vistas blancas
        //   basados en el ancho de la pantalla y los espacios entre vistas
        var espacioHorizontalPerItem  = 8.0
        var espaciadoTotalItemsHorizontal = (totalItemsHorizontal + 1) * espacioHorizontalPerItem
        var anchoItem = (viewCalculadora!!.measuredWidth - espaciadoTotalItemsHorizontal)/totalItemsHorizontal

        //3. Calculamos el alto resultante de toda la botonería con el aspect 1:1
        //   y tomando en cuenta los espacios entre botones
        var espacioVerticalPerItem  = 8.0
        var espaciadoTotalItemsVertical = (totalItemsVertical + 1) * espacioVerticalPerItem
        var altoResultante = (anchoItem * multiplierPropuesto * totalItemsVertical) + espaciadoTotalItemsVertical


        //4. Determinamos si es necesario cambiar el multiplier a
        //   un valor menor que 1 (viendo si el alto resulto mayor que el espacio disponible)
        var ajustar = (altoResultante > viewCalculadora.measuredHeight)


        //5. Repetimos el proceso de cambiar el multiplier a
        //   mientras sea necesario (lo bajamos de 1% en cada vuelta)
        //  Ej. Baja de 100% a 99%, luego de 99% a 98%, y así sucesivamente
        while (ajustar) {
            multiplierPropuesto -= 0.01
            altoResultante = (anchoItem * multiplierPropuesto * totalItemsVertical) + espaciadoTotalItemsVertical
            ajustar = (altoResultante > viewCalculadora.measuredHeight)
        }

        return multiplierPropuesto
    }

Любая помощь будет оценена.

...