如何在EditText中隐藏下划线

我如何隐藏EditText下划线(提示行与小衬线在结束)?

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

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

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

399560 次浏览

您可以将EditText设置为自定义透明可绘制对象,或者直接使用

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

android:background="@null"

或通过编程的方式

editText.setBackgroundResource(android.R.color.transparent);

请将编辑文本背景设置为

# EYZ0

它会起作用的。

将background设置为null。

android:background="@null"
你可以将EditTextbackgroundTint值设置为特定的颜色。 如果你设置了透明颜色,下杠应该消失

# EYZ0

# EYZ0

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

我所做的是创建一个Shape drawable,并将其设置为背景:

<?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>

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

使用任一属性:

android:background="@null"

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

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

然而,请注意,它会导致TextInputLayout的间距问题,我已经围绕EditText

你可以通过编程方式使用setBackgroundResource:

editText.setBackgroundResource(android.R.color.transparent);
我发现了一件最奇怪的事!如果你使用数据绑定将它设置为null: # EYZ0 < / p >

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

在所有API级别上可能不会有相同的最终结果,所以要小心!谁能告诉我你是否测试过这个方法是否可靠。(还要注意,底部填充突出是因为原来的下划线。所以你可能想要在XML中改变它,或者在代码中重置它,在它加载到equal top…

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

android:textCursorDrawable="@null"

还可以为editText定义一个STYLE,这样就可以重新组合所有属性。这是非常强大的,如果你有多个编辑文本,需要有行为

将代码放在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" />

这里有一个隐藏它的方法,而不破坏默认的填充:

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()

您还必须设置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"
/>

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

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

我使用的一个可绘制的例子是:

<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删除整个应用程序的下划线,你不必手动应用每个样式。

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

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会变得更小。至少,这是我的案子。

一个小提示是,如果你设置后台为空,并尝试我上面提供的java代码,你的应用程序将在执行后立即崩溃。(因为它得到了背景,但它是空的。)这可能是显而易见的,但我认为指出这一点很重要。

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

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

# EYZ0

 editText.setBackgroundColor(Color.TRANSPARENT);

背景设置为空

android:background="@null" in your xml

如果你正在使用background,那么你必须使用这个标签

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

android:background="@null"

在我的例子中,editText.setBackgroundResource(R.color.transparent);是最好的。

它不删除默认填充,只是在栏下。

# EYZ0

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

android:inputType="textVisiblePassword"

,它可以很好地完成工作。 它不是最优解,但它是有效的

要同时保留页边距和背景色,请使用:

background.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" />
android:inputType="textVisiblePassword|textMultiLine"
android:background="@android:color/transparent"

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

如果你正在使用EditTextTextInputLayout使用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>

另一个选择,你可以创建自己的自定义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...
}
}

在您的XML Edittext中使用此代码

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

如下面的代码所示

         <EditText
android:id="@+id/EditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"/>

对于固定提示使用这个

        <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>

让我们在android中做一些更简单的事情,比如outlinedbox和Null background of edittext。如下所示。

只是复制粘贴

编辑文本与OutlinedBox密码与toogle选项在结束。

    <com.google.android.material.textfield.TextInputLayout
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/password"
app:boxCornerRadiusBottomEnd="10dp"
app:boxCornerRadiusBottomStart="10dp"
app:boxCornerRadiusTopEnd="10dp"
app:boxCornerRadiusTopStart="10dp"
app:boxStrokeColor="@color/primary_color"
app:boxStrokeWidth="1dp"
app:boxStrokeWidthFocused="1dp"
app:errorIconDrawable="@null"
app:hintTextColor="#d3d3d3"
app:passwordToggleDrawable="@drawable/password_toggle"
app:passwordToggleEnabled="true">
    

<com.google.android.material.textfield.TextInputEditText
android:id="@+id/etPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:paddingStart="10dp"
android:paddingEnd="0dp"
android:textCursorDrawable="@null"
android:textSize="12sp" />
</com.google.android.material.textfield.TextInputLayout>

password_toggle创建Drawble

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_show" android:state_checked="true"/>
<item android:drawable="@drawable/ic_hide"/>
</selector>

现在没有任何边界的编辑文本。

电子邮件编辑文本

<com.google.android.material.textfield.TextInputEditText
android:id="@+id/email"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg_edittext"
android:hint="@string/enter_your_email"
android:imeOptions="actionDone"
android:inputType="textEmailAddress"
android:maxLines="1"
android:padding="10dp"
android:singleLine="true"
android:textColor="@color/black"
android:textColorHint="#d3d3d3"
android:textSize="12sp" />

对于密码编辑文本。

<com.google.android.material.textfield.TextInputEditText
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg_edittext"
android:hint="@string/enter_your_password"
android:imeOptions="actionDone"
android:inputType="textEmailAddress"
android:maxLines="1"
android:padding="10dp"
android:singleLine="true"
android:textColor="@color/black"
android:textColorHint="#d3d3d3"
android:textSize="12sp" />

在editText Android Studio中删除下划线的几种方法

< p > # EYZ0 # EYZ0
或< / em >

# EYZ1 # EYZ0

**或程序化的**

# EYZ0