【问题标题】:Set button's height equal to width when width is wrap_content当宽度为 wrap_content 时,设置按钮高度等于宽度
【发布时间】:2023-03-23 07:57:01
【问题描述】:
<Button
  android:id="@+id/button"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content" << Should probably change
  android:text="Button" />

当宽度设置为 wrap_content 时,如何创建方形按钮?

我已尝试遵循此问题的答案:
Set button height equal to the button width
但我似乎无法获得实际匹配内容的宽度,它只是填满了整个屏幕(类似于 match_parent)

【问题讨论】:

标签: android


【解决方案1】:

经过更多研究,我最终达到了这个要求。

正如这里的一些人指出的那样,大多数地方给出的解决方案是这样的(转换为 kotlin):

class SquareButton(context: Context, attrs: AttributeSet) : Button(context, attrs) {
    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)

        val width: Int = MeasureSpec.getSize(widthMeasureSpec);
        setMeasuredDimension(width, width)
    }
}

场景中MeasureSpec.getSize 的问题在于(连同MeasureSpec.getMode)它包含宽度的大小调整“规则”。
在这种情况下:尺寸:(可用尺寸)+模式:(AT_MOST)=按钮允许的最大宽度

另一个选项是获取已由 Button 类计算的最小宽度:

class SquareButton(context: Context, attrs: AttributeSet) : Button(context, attrs) {
    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)

        val width: Int = measuredWidth
        setMeasuredDimension(width, width)
    }
}

getMeasuredWidth() 通过 setMeasuredDimension() 返回 onMeasure() 中设置的宽度测量值。

What is the difference between MeasureSpec.getSize(widthMeasureSpec) and getWidth()?

在调用super.onMeasure 时将measuredWidth 属性设置为wrap_content 值。这是宽度和高度的所需值。

【讨论】:

    猜你喜欢
    • 2015-06-24
    • 2020-06-11
    • 2016-03-08
    • 1970-01-01
    • 2011-12-08
    • 2021-10-08
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    相关资源
    最近更新 更多