Я работаю с 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
}
Любая помощь будет оценена.