es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

cómo cambiar la altura de una vista programáticamente basándose en la altura de un diseño.

Estoy trabajando en una aplicación y necesito crear una especie de baldosa con aspecto de medidor. Entonces básicamente, he creado un archivo xml simple con el diseño que necesito y todas las vistas, como se muestra a continuación:

<androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/tile_layout"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_columnWeight="1"
        android:background="@color/transparent">

    <View
        android:id="@+id/gauge"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="invisible"/>


En el fragmento, estoy haciendo lo siguiente:
    val layout: ConstraintLayout = view.findViewById(R.id.tile_layout)
    val gauge = view.findViewById<View>(R.id.gauge)
    val ratio = 75

view.layoutParams = getParams()
val newParams: ViewGroup.LayoutParams = gauge.layoutParams
newParams.height = (layout.height * ratio / 100)
gauge.setLayoutParams(newParams)

“`

No está funcionando, la altura sigue siendo la misma. Estoy buscando que la altura de la vista del medidor sea aproximadamente el 75% de la altura del diseño.

¿Alguna idea de cómo hacerlo?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para que la vista del medidor tenga una altura aproximada al 75% de la altura del diseño, debes realizar las siguientes modificaciones en tu código:

    1. Establece el atributo de visibilidad de la vista del medidor como “visible”, para que pueda ser medido correctamente.
    2. Utiliza ViewTreeObserver para agregar un listener que actualizará la altura de la vista del medidor después de que se haya dibujado el diseño.

    Aquí te mostramos cómo puedes modificar tu código para lograr esto:

    <androidx.constraintlayout.widget.constraintlayout android:id="@+id/tile_layout" android:layout_width="0dp" android:layout_height="match_parent" android:layout_columnweight="1" android:background="@color/transparent">
    
        <view android:id="@+id/gauge" android:layout_width="match_parent" android:layout_height="0dp" android:visibility="invisible"></view>
    </androidx.constraintlayout.widget.constraintlayout>
    
    val layout: ConstraintLayout = view.findViewById(R.id.tile_layout)
    val gauge = view.findViewById<View>(R.id.gauge)
    
    // Establece la visibilidad de la vista del medidor como visible
    gauge.visibility = View.VISIBLE
    
    // Utiliza ViewTreeObserver para agregar un listener de diseño
    gauge.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
        override fun onGlobalLayout() {
            // Elimina el listener para evitar múltiples llamadas
            gauge.viewTreeObserver.removeOnGlobalLayoutListener(this)
    
            // Calcula la nueva altura
            val ratio = 0.75 // 75%
            val newHeight = (layout.height * ratio).toInt()
    
            // Actualiza los parámetros de diseño de la vista del medidor
            val params = gauge.layoutParams as ConstraintLayout.LayoutParams
            params.height = newHeight
            gauge.layoutParams = params
        }
    })
    

    Aquí, primero establecemos la visibilidad de la vista del medidor como “visible”, para que pueda ser medido correctamente. Luego, utilizamos ViewTreeObserver para agregar un listener de diseño que se llamará después de que se haya dibujado el diseño. En el listener, calculamos la nueva altura de la vista del medidor en base a la proporción y actualizamos sus parámetros de diseño en consecuencia. Por último, eliminamos el listener para evitar múltiples llamadas a él.

Comments are closed.