如何从 EditText 中删除所有默认填充?

How can I remove all default padding from EditText?

我正在使用 EditText,它总是在我的文本左右两侧添加一些填充。
添加 android:includeFontPadding="false" 没有帮助,使用否定 android:layout_marginLeftandroid: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)
}