【问题标题】:Width of FrameLayout never truly 0FrameLayout 的宽度永远不会真正为 0
【发布时间】:2018-07-09 13:46:31
【问题描述】:

我目前正面临一个使用 ConstraintLayout 的奇怪错误(?)。 我正在尝试将作为 Constraintlayout 的子项的 FrameLayout 的宽度设置为 0px。

我通过以下代码 sn-p 设置宽度:

// 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 似乎从来没有达到 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 是“匹配约束”,如果你不想显示它,那么让它成为 1px
  • @EpicPandaForce 这确实成功了,尤其是“1px”提示。您介意将其发布为答案,以便以后对其他人有所帮助吗?
  • 通常使用 View.GONE 是首选方式,除非您尝试在 RecyclerView 中执行此操作。在那里,GONE 是不够的,所以使用 1px 是一种 hack,但它有效!

标签: android kotlin android-constraintlayout android-framelayout


【解决方案1】:

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

如文档所述:

小部件的尺寸可以通过设置 3 中的android:layout_widthandroid:layout_height 属性 不同的方式

1- 使用特定尺寸(文字值,例如 123dp 或 尺寸参考);

2- 使用WRAP_CONTENT,它将要求小部件计算自己的大小;

3- 使用 0dp,相当于MATCH_CONSTRAINT

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

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

现在,如果您希望更改宽度/高度以用于动画目的或出于任何其他原因,请将其更改为 1dp 或适合您需要的任何其他尺寸。

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

【讨论】:

    猜你喜欢
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2023-03-26
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多