FrameLayout 的宽度永远不会真正为 0

Width of FrameLayout never truly 0

我目前遇到了一个关于 ConstraintLayout 的奇怪错误(?)。 我正在尝试将作为 Constraintlayout 子项的 FrameLayout 的宽度设置为 0px。

我通过以下代码片段设置宽度:

// set width
val newWidth = 0
val frameParams = frame.layoutParams as ConstraintLayout.LayoutParams
frameParams.width = newWidth
frame.layoutParams = frameParams
logE("newWidth: $newWidth, frame.measuredWidth: ${frame.measuredWidth}, frame.width: ${frame.width}")

奇怪的是,我的 FrameLayout 似乎从未达到 "true" 0px 的宽度,而是一些接近 0 的随机值。请参阅下面的精选日志:

E/Log: newWidth: 0, frame.measuredWidth: 6, frame.width: 6
E/Log: newWidth: 0, frame.measuredWidth: 10, frame.width: 10
E/Log: newWidth: 0, frame.measuredWidth: 1, frame.width: 1

如您所见,FrameLayouts 宽度及其测量宽度均未达到 0 值。 这是已知错误吗?如果是,有人知道解决方法吗?

如果您需要任何进一步的信息,请告诉我。提前致谢!

这根本不是错误。在约束布局中,0dp 被评估为 match_constraint,它将根据您定义的约束占用 space。

如文档所述:

The dimension of the widgets can be specified by setting the android:layout_width and android:layout_height attributes in 3 different ways:

1- Using a specific dimension (either a literal value such as 123dp or a Dimension reference);

2- Using WRAP_CONTENT, which will ask the widget to compute its own size;

3- Using 0dp, which is the equivalent of MATCH_CONSTRAINT.

如果您的目标是让视图消失,您可以更改其可见性而不是更改宽度或高度。

val view: View = findViewById(R.id.yourView)
view.visibility = View.GONE // Or View.INVISIBLE

现在,如果您想更改 width/height 用于动画目的或任何其他原因,请将其更改为 1dp 或适合您需要的任何其他大小。

您可以在 Android training guide and on its docs 上阅读有关 ConstraintLayout 的更多信息。