如何从 EditText 中删除所有默认填充?
How can I remove all default padding from EditText?
我正在使用 EditText
,它总是在我的文本左右两侧添加一些填充。
添加 android:includeFontPadding="false"
没有帮助,使用否定 android:layout_marginLeft
或 android:layout_marginRight
只会使 EditText
"expand".
如何去除默认添加的 EditText
中的所有填充?
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="20dp"
android:fontFamily="roboto-regular"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:layout_marginLeft="-5dp"
android:layout_marginRight="-5dp"
android:includeFontPadding="false"
android:textSize="@dimen/size"
android:textColor="@color/color"
android:inputType="textCapWords"
android:hint="@string/hint"
android:editable="false"
/>
去除EditText
左右两边的padding,可以使用如下:
<EditText
...
android:paddingLeft="0dp"
android:paddingRight="0dp"
... />
如果您还想删除下划线填充,请添加负边距:
<EditText
...
android:layout_marginLeft="-4dp"
android:layout_marginRight="-4dp"
... />
事实上,EditText 有自己的可绘制填充,即使在 xml 中将所有 paddings/margins 设置为零后,它仍然存在。
要从 EditText 中完全删除填充,您必须将其从实际上是 InsetDrawable 的可绘制对象中删除。
您可以将您的可绘制对象转换为 InsetDrawable
,通过 getDrawable()
方法获取原始可绘制对象。原始可绘制对象根本没有额外的间距,您可以通过 setBackground()
将其设置为新背景到您的 EditText
小部件。
val etRemovedSpacingAllSides = findViewById<EditText>(R.id.etRemovedSpacingAllSides)
if (etRemovedSpacingAllSides.background is InsetDrawable) {
val insetDrawable = etRemovedSpacingAllSides.background as InsetDrawable
val originalDrawable = insetDrawable.drawable!!
etRemovedSpacingAllSides.background = originalDrawable
}
但您宁愿希望它保存其顶部和底部插图,否则 EditText
看起来很难看。
要保留水平间距,您必须从插入的可绘制填充尺寸中减去原始填充尺寸。我假设填充是通过将原始可绘制填充和可绘制插图相加来计算的。因此,要仅检索插图,您必须执行减法。
这是完整示例(对应于图片上的“仅水平删除间距”EditText
):
val editText = findViewById<EditText>(R.id.etRemovedSpacing)
if (editText.background is InsetDrawable) {
val insetDrawable = editText.background as InsetDrawable
val originalDrawable = insetDrawable.drawable!!
val insetDrawablePadding = Rect()
insetDrawable.getPadding(insetDrawablePadding)
val originalDrawablePadding = Rect()
originalDrawable.getPadding(originalDrawablePadding)
// We subtract original padding dimensions from inset drawable padding dimensions.
// We assume that padding is calculated by summing original drawable padding
// and inset drawable insets. So to retrieve only insets we have to perform subtraction
val insetDrawableInsets = Rect(
insetDrawablePadding.left - originalDrawablePadding.left,
insetDrawablePadding.top - originalDrawablePadding.top,
insetDrawablePadding.right - originalDrawablePadding.right,
insetDrawablePadding.bottom - originalDrawablePadding.bottom)
// Remove side spacing from editText background to make it fit fully into layout width
editText.background = InsetDrawable(
originalDrawable,
0, insetDrawablePadding.top, 0, insetDrawableInsets.bottom)
}
我正在使用 EditText
,它总是在我的文本左右两侧添加一些填充。
添加 android:includeFontPadding="false"
没有帮助,使用否定 android:layout_marginLeft
或 android:layout_marginRight
只会使 EditText
"expand".
如何去除默认添加的 EditText
中的所有填充?
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="20dp"
android:fontFamily="roboto-regular"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:layout_marginLeft="-5dp"
android:layout_marginRight="-5dp"
android:includeFontPadding="false"
android:textSize="@dimen/size"
android:textColor="@color/color"
android:inputType="textCapWords"
android:hint="@string/hint"
android:editable="false"
/>
去除EditText
左右两边的padding,可以使用如下:
<EditText
...
android:paddingLeft="0dp"
android:paddingRight="0dp"
... />
如果您还想删除下划线填充,请添加负边距:
<EditText
...
android:layout_marginLeft="-4dp"
android:layout_marginRight="-4dp"
... />
事实上,EditText 有自己的可绘制填充,即使在 xml 中将所有 paddings/margins 设置为零后,它仍然存在。 要从 EditText 中完全删除填充,您必须将其从实际上是 InsetDrawable 的可绘制对象中删除。
您可以将您的可绘制对象转换为 InsetDrawable
,通过 getDrawable()
方法获取原始可绘制对象。原始可绘制对象根本没有额外的间距,您可以通过 setBackground()
将其设置为新背景到您的 EditText
小部件。
val etRemovedSpacingAllSides = findViewById<EditText>(R.id.etRemovedSpacingAllSides)
if (etRemovedSpacingAllSides.background is InsetDrawable) {
val insetDrawable = etRemovedSpacingAllSides.background as InsetDrawable
val originalDrawable = insetDrawable.drawable!!
etRemovedSpacingAllSides.background = originalDrawable
}
但您宁愿希望它保存其顶部和底部插图,否则 EditText
看起来很难看。
要保留水平间距,您必须从插入的可绘制填充尺寸中减去原始填充尺寸。我假设填充是通过将原始可绘制填充和可绘制插图相加来计算的。因此,要仅检索插图,您必须执行减法。
这是完整示例(对应于图片上的“仅水平删除间距”EditText
):
val editText = findViewById<EditText>(R.id.etRemovedSpacing)
if (editText.background is InsetDrawable) {
val insetDrawable = editText.background as InsetDrawable
val originalDrawable = insetDrawable.drawable!!
val insetDrawablePadding = Rect()
insetDrawable.getPadding(insetDrawablePadding)
val originalDrawablePadding = Rect()
originalDrawable.getPadding(originalDrawablePadding)
// We subtract original padding dimensions from inset drawable padding dimensions.
// We assume that padding is calculated by summing original drawable padding
// and inset drawable insets. So to retrieve only insets we have to perform subtraction
val insetDrawableInsets = Rect(
insetDrawablePadding.left - originalDrawablePadding.left,
insetDrawablePadding.top - originalDrawablePadding.top,
insetDrawablePadding.right - originalDrawablePadding.right,
insetDrawablePadding.bottom - originalDrawablePadding.bottom)
// Remove side spacing from editText background to make it fit fully into layout width
editText.background = InsetDrawable(
originalDrawable,
0, insetDrawablePadding.top, 0, insetDrawableInsets.bottom)
}