<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)
答案 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);
}
}