[英]how to change a view height programmatically based on a layout height
我正在開發一個應用程序,我需要創建一種看起來像儀表的瓷磚。 所以基本上,我創建了一個簡單的 xml 文件。 使用我需要的布局和所有視圖,如下所示:
<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"/>
...
在片段中,我正在做:
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)
它不起作用,高度仍然相同。 我希望儀表視圖高度約為布局高度的 75%。
知道怎么做嗎?
我認為您需要通過添加OnGlobalLayoutListener
來完全創建布局時獲得高度; 然后使用layout.measuredHeight
而不是layout.height
:
val layout: ConstraintLayout = view.findViewById(R.id.tile_layout)
val gauge = view.findViewById<View>(R.id.gauge)
layout.viewTreeObserver.addOnGlobalLayoutListener(object :
ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
val ratio = 75
view.layoutParams = getParams()
val newParams: ViewGroup.LayoutParams = gauge.layoutParams
newParams.height = (layout.measuredHeight * ratio / 100)
gauge.layoutParams = newParams
layout.viewTreeObserver.removeOnGlobalLayoutListener(this)
}
})
Zain 所說的可能是正確的,但是您沒有顯示足夠的代碼來知道這是否正確。 我會說您的儀表視圖沒有設置約束,並且約束是ConstraintLayout的每個直接子級都應該具有的,並且match_parent
是無效的。 請參閱ConstraintLayout的文檔。
重要提示:不建議將 MATCH_PARENT 用於 ConstraintLayout 中包含的小部件。 類似的行為可以通過使用 MATCH_CONSTRAINT 來定義,並將相應的左/右或上/下約束設置為“父級”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.