当width为wrap_content时,将按钮的高度设置为等于宽度

时间:2019-12-13 20:16:08

标签: android

<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)

2 个答案:

答案 0 :(得分:0)

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

正如这里的一些人指出的,大多数地方给出的解决方案是这样的(转换为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)它包含宽度的大小“规则”。
在这种情况下:size :(可用大小)+ mode:(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值。这是宽度和高度的期望值。

答案 1 :(得分:-1)

import android.content.Context;
import android.util.AttributeSet;
import android.widget.Button;

public class ResizableButton extends Button {

    public ResizableButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int width = MeasureSpec.getSize(widthMeasureSpec);
        setMeasuredDimension(width, width);
    }
}

来源:https://stackoverflow.com/a/29702054/646391