577

如何隐藏 EditText 下栏(末尾带有小衬线的提示行)?

可能有更好的方法来做我想做的事:我有一个带有 EditText 的布局。通常,在用户可以点击它并开始输入或编辑文本的地方,这显示得很好。

但是,有时我想使用相同的布局(简化其他逻辑)以只读方式显示相同的数据。我希望演示文稿相似 - 它应该具有相同的高度和相同的字体,但没有下划线。

作为权宜之计,我将通过删除 EditText 并替换 TextView 来实现这一点。我认为这会产生预期的结果,但它似乎是一种迂回,一种昂贵的方式来做一些应该很容易通过改变属性来完成的事情。

4

27 回答 27

1219

您可以将其设置EditText为具有自定义透明可绘制对象或仅使用

android:background="@android:color/transparent"

或者

android:background="@null"

或以编程方式

editText.setBackgroundResource(android.R.color.transparent);
于 2012-12-20T15:38:19.220 回答
106

将背景设置为空。

android:background="@null"
于 2015-03-09T11:53:07.550 回答
43

您可以将EditText' backgroundTint值设置为特定颜色。如果您设置透明颜色,下划线应该消失。

android:backgroundTint="@color/Transparent"

<color name="Transparent">#00000000</color>

但是您可以在Api v21(Lollipop)或更高版本中使用它

于 2015-12-03T14:21:10.467 回答
26

请将您的edittext背景设置为

android:background="#00000000"

它会起作用的。

于 2014-11-16T16:19:12.590 回答
24

您可以使用以下方式以编程方式执行此操作setBackgroundResource

editText.setBackgroundResource(android.R.color.transparent);
于 2016-12-12T11:46:15.427 回答
16

使用任一属性:

android:background="@null"

或者

android:background="@android:color/transparent"

为我工作以隐藏 EditText 的下划线。

但是,请注意,它会导致我包围的 TextInputLayout 出现间距问题EditText

于 2016-05-25T03:01:34.117 回答
16

我所做的是创建一个 Shape 可绘制对象并将其设置为背景:

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <padding
        android:top="8dp"
        android:bottom="8dp"
        android:left="8dp"
        android:right="8dp" />

    <solid android:color="#fff" />

</shape>

注意:我实际上使用了firelds的@dimen@color值,但为了清楚起见,我在这里简化了形状文件。

于 2016-02-22T16:03:07.660 回答
12

这是一种隐藏它的方法,不会破坏默认填充:

fun View.setViewBackgroundWithoutResettingPadding(background: Drawable?) {
    val paddingBottom = this.paddingBottom
    val paddingStart = ViewCompat.getPaddingStart(this)
    val paddingEnd = ViewCompat.getPaddingEnd(this)
    val paddingTop = this.paddingTop
    ViewCompat.setBackground(this, background)
    ViewCompat.setPaddingRelative(this, paddingStart, paddingTop, paddingEnd, paddingBottom)
}

用法:

editText.setViewBackgroundWithoutResettingPadding(null)

更新:

如果你发现自己总是传递 null,你可以在方法中编写它(然后你也可以重载 EditText 本身)

fun EditText.removeUnderline() {
    val paddingBottom = this.paddingBottom
    val paddingStart = ViewCompat.getPaddingStart(this)
    val paddingEnd = ViewCompat.getPaddingEnd(this)
    val paddingTop = this.paddingTop
    ViewCompat.setBackground(this, null)
    ViewCompat.setPaddingRelative(this, paddingStart, paddingTop, paddingEnd, paddingBottom)
}

// usage:
editText.removeUnderline()
于 2018-02-13T13:57:12.983 回答
11

如果您在TextInputLayout中使用EditText ,请按以下方式使用:app:boxBackgroundMode="none"

<com.google.android.material.textfield.TextInputLayout
    app:boxBackgroundMode="none"
    ...
    >

    <EditText
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</com.google.android.material.textfield.TextInputLayout>
于 2020-08-06T10:36:23.060 回答
10

在我的情况下,我使用自定义背景来编辑文本,因此将背景设置为 @null 或将色调设置为透明不是我的解决方案,所以我玩了一个小技巧,它对我非常有效,我刚刚设置

android:inputType="textVisiblePassword"

它可以很好地完成工作..它不是最佳解决方案,但它有效

于 2019-09-26T21:25:46.597 回答
7

您还必须设置 minWidth,否则如果文本为空,光标将消失。

        <EditText
            android:id="@+id/et_card_view_list_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:minWidth="30dp"
            android:layout_weight="1"
            android:inputType="text"
            android:text="Name"
            android:background="@android:color/transparent"
            />
于 2018-03-13T20:18:01.300 回答
5

我有这样的东西非常有用:

generalEditText.getBackground().mutate().setColorFilter(getResources().getColor(R.color.white), PorterDuff.Mode.SRC_ATOP);

其中generalEditText 是我的EditText,白色是:

<color name="white">#ffffff</color>

这不会删除填充,您的 EditText 将保持原样。只有底部的行将被删除。有时这样做更有用。

如果您使用android:background="@null"尽可能多的建议,您会丢失填充并且 EditText 会变小。至少,这是我的情况。

需要注意的是,如果您将背景设置为 null 并尝试我上面提供的 java 代码,您的应用程序将在执行后立即崩溃。(因为它有背景但它是空的。)这可能很明显,但我认为指出它很重要。

于 2018-08-28T07:13:53.083 回答
5

只需使用这个

 editText.setBackgroundColor(Color.TRANSPARENT);
于 2018-11-30T08:39:24.740 回答
4

我发现了最奇怪的事情!如果将其设置为null使用数据绑定: android:background="@{null}"

然后不仅背景被删除,而且视图仍然具有从默认背景计算的填充。所以由于某种原因,延迟的 null 设置不会清除前一个 bg 中的填充..?视图上的填充是左/上/右 4dp,底部 13dp(来自模拟器级别 21)。

在所有 API 级别上可能不会有相同的最终结果,所以要小心!有人告诉我您是否对此进行了测试并发现它可靠。(另请注意,底部填充由于原始中的下划线而突出。所以您可能希望在 XML 中更改它,或者在加载到等于顶部后在代码中重置它......

于 2017-04-04T04:14:55.910 回答
4

如果您的编辑文本已经有背景,那么您可以使用以下。

android:textCursorDrawable="@null"
于 2017-07-27T08:05:16.377 回答
4

如果您希望这影响 EditText 的所有实例以及从它继承的任何类,那么您应该在主题中设置属性 editTextBackground 的值。

  <item name="android:editTextBackground">@drawable/bg_no_underline</item>

我使用的drawable的一个例子是:

<inset xmlns:android="http://schemas.android.com/apk/res/android"
     android:insetLeft="@dimen/abc_edit_text_inset_horizontal_material"
     android:insetRight="@dimen/abc_edit_text_inset_horizontal_material"
     android:insetTop="@dimen/abc_edit_text_inset_top_material"
     android:insetBottom="@dimen/abc_edit_text_inset_bottom_material">
    <selector>
      <item android:drawable="@android:color/transparent"/>
    </selector>
</inset>

这是默认材料设计实现的略微修改版本。

应用后,它将使您的所有 EditText 删除整个应用程序中的下划线,并且您不必手动将样式应用于每一个。

于 2018-07-31T13:17:47.000 回答
2
android:background="@android:color/transparent"

或者

android:background="@null"
于 2019-03-20T06:32:15.847 回答
2

您还可以为您的 editText 定义一个样式,以便您可以重新组合所有共同的属性。如果您必须多次编辑需要具有该行为的文本,它非常强大

将代码放入 res/values/styles.xml

<style name="MyEditTextStyle" parent="@android:style/TextAppearance.Widget.EditText">
    <item name="android:background">@color/transparence</item> //NO UNDERBAR
    <item name="android:maxLines">1</item>
    <item name="android:height">28dp</item> //COMMON HEIGHT
</style>

之后你只需要在你的editText中调用它

<EditText
    android:id="@+id/edit1"
    style="@style/MyEditTextStyle"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

<EditText
    android:id="@+id/edit2"
    style="@style/MyEditTextStyle"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
于 2018-01-23T12:15:42.860 回答
1

以编程方式使用:editText.setBackground(null)

xml使用:android:background="@null"

于 2018-10-19T05:39:18.147 回答
1
android:inputType="textVisiblePassword|textMultiLine"
android:background="@android:color/transparent"

...它不是最佳解决方案,但它有效。

于 2019-11-29T20:00:19.773 回答
1

在您的 XML Edittext 中使用此代码

android:background="@android:color/transparent"
于 2021-09-07T08:04:44.023 回答
0

要保留边距和背景颜色,请使用:

背景.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <padding
        android:bottom="10dp"
        android:left="4dp"
        android:right="8dp"
        android:top="10dp" />

    <solid android:color="@android:color/transparent" />

</shape>

编辑文本:

<androidx.appcompat.widget.AppCompatEditText
    android:id="@+id/none_content"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/background"
    android:inputType="text"
    android:text="First Name And Last Name"
    android:textSize="18sp" />
于 2019-11-13T11:08:31.043 回答
0

将背景设置为空

android:background="@null" in your xml 
于 2019-03-16T06:24:38.180 回答
0

如果您使用背景,那么您必须使用此标签

android:testCursorDrawable="@null" 
于 2019-03-16T06:30:14.533 回答
0

另一种选择是,您可以像这样创建自己的自定义 EditText:

class CustomEditText : androidx.appcompat.widget.AppCompatEditText {
    constructor(context: Context?) : super(context)
    constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

    private val paint = Paint()
    private val path = Path()

    init { // hide your underbar
        this.setBackgroundResource(android.R.color.transparent)

        // other init stuff...
    }

    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)

        // draw your canvas...
    }
}
于 2020-08-28T12:31:26.377 回答
0

就我而言,editText.setBackgroundResource(R.color.transparent);是最好的。

它不会删除默认填充,就在 bar 下。

R.color.transparent = #00000000

于 2019-04-29T09:27:14.370 回答
0

对于固定提示使用这个

        <item name="boxStrokeWidth">0dp</item>
        <item name="boxCornerRadiusTopStart">12dp</item>
        <item name="boxCornerRadiusTopEnd">12dp</item>
        <item name="boxCornerRadiusBottomStart">12dp</item>
        <item name="boxCornerRadiusBottomEnd">12dp</item>
于 2021-09-10T10:51:06.080 回答