Tengo una vista personalizada que extiende LinearLayout, estoy calculando y actualizando dinámicamente la altura de la vista en función de su posición superior (con el objetivo de llenar el espacio restante de la pantalla).

  • La jerarquía de vistas es como: CoordinatorLayout(llenar la pantalla)
    |__ AppBarLayout
    |__ RecyclerView (layout_height="match_parent").
        |__ Sección: Vista
        hermana |__ Sección: MyCustomView

  • Así es más o menos cómo se ve mi vista personalizada:

    • MiVistaPersonalizada.kt
class MyCustomView constructor(context: Context, attrs: AttributeSet? = null) : LinearLayout(context, attrs) {
    private var widthSpec = 0

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        widthSpec = widthMeasureSpec
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
    }

    override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
        super.onLayout(changed, l, t, r, b)
        // calculate adjustedHeight based on the screen height 
        // and current distance from top border to the screen top edge
        val adjustedHeight = ...
        val newHeightSpec: Int = MeasureSpec.makeMeasureSpec(adjustedHeight, MeasureSpec.EXACTLY)

        measure(widthSpec, newHeightSpec)
    }
}

Después measurede que se llamó onLayout, onMeasurese llamó con ajustado heightMeasureSpec, pero después de eso onLayoutno se llama para que la altura del diseño no se actualice.

Solo quiero obtener alguna pista sobre en qué caso onLayoutno se llamará después de onMeasure. ¿Alguna bandera o caché que posiblemente se pueda cambiar desde el exterior? ¿O hay alguna forma de garantizar que la altura se actualice cada vez que cambie?

no se encontró respuesta