Android开发如何实现EditText控件正方形边框效果
Android正方形带边框EditText实现方案
你当前的实现不是正方形是因为EditText宽高设为wrap_content会跟随内容长度变化,drawable形状默认适配控件尺寸,不会强制正方形,可通过以下三种方案调整:
方案1:固定宽高(简单直接,适合固定尺寸场景)
直接将EditText的宽高设置为相同的固定值即可,可额外添加android:gravity="center"让输入内容居中显示:
<EditText android:layout_width="80dp" android:id="@+id/codeFirst" android:padding="@dimen/appbar_padding" android:layout_height="80dp" android:background="@drawable/edittext_border" android:gravity="center" android:lines="2"/>
你原有绑定的edittext_border drawable代码无需修改。
方案2:ConstraintLayout宽高比约束(适配性强,推荐响应式场景)
如果外层使用ConstraintLayout布局,可通过宽高比属性强制控件为1:1正方形,无需写死尺寸,可自动适配父布局大小:
<EditText android:id="@+id/codeFirst" android:layout_width="0dp" android:layout_height="0dp" android:background="@drawable/edittext_border" android:padding="@dimen/appbar_padding" android:gravity="center" android:lines="2" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" <!-- 宽度占父布局宽度的20%,可按需调整 --> app:layout_constraintWidth_percent="0.2" <!-- 强制宽高比为1:1 保持正方形 --> app:layout_constraintDimensionRatio="1:1"/>
方案3:自定义EditText(适合全局复用、动态适配场景)
重写EditText的onMeasure方法,强制宽高始终相等:
class SquareEditText @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null ) : androidx.appcompat.widget.AppCompatEditText(context, attrs) { override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { super.onMeasure(widthMeasureSpec, heightMeasureSpec) // 取宽高中的较小值作为统一尺寸,也可按需取较大值 val squareSize = measuredWidth.coerceAtMost(measuredHeight) setMeasuredDimension(squareSize, squareSize) } }
布局中直接使用自定义控件即可,宽高设为wrap_content也会自动变为正方形。
内容的提问来源于stack exchange,提问作者Malo
相关产品推荐
相关产品推荐

