So verstecken Sie die Unterleiste in EditText


496

Wie kann ich die EditText-Unterleiste ausblenden (die Eingabeaufforderungszeile mit kleinen Serifen an den Enden)?

Es gibt vielleicht einen besseren Weg, um das zu tun, was ich will: Ich habe ein Layout mit einem EditText. Normalerweise wird dies gut angezeigt, wenn der Benutzer darauf tippen und mit der Eingabe oder Bearbeitung von Text beginnen kann.

Manchmal möchte ich jedoch dasselbe Layout verwenden (vereinfacht andere Logik), um dieselben Daten schreibgeschützt anzuzeigen. Ich möchte, dass die Präsentation ähnlich ist - sie sollte dieselbe Höhe und dieselbe Schriftart haben, aber nicht die Unterleiste.

Als Stop-Gap-Maßnahme werde ich dies implementieren, indem ich den EditText entferne und eine Textansicht ersetze. Ich denke, das wird zu den gewünschten Ergebnissen führen, aber es scheint ein Kreisverkehr zu sein, der eine teure Möglichkeit darstellt, etwas zu tun, das durch Ändern der Attribute einfach zu tun sein sollte.


Antworten:


1052

Sie können festlegen EditText, dass ein benutzerdefiniertes transparentes Zeichenelement verwendet wird, oder es einfach verwenden

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

oder

android:background="@null"

oder programmatisch

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

7
Die beste Antwort ist, wie ha1ogen sagt, eine benutzerdefinierte Zeichnung zu erstellen. Beginnen Sie mit dem 9-Patch, der für normale EditText-Felder verwendet wird. Ändern Sie es, um die Unterleiste und andere Grafiken, die Sie nicht möchten, zu entfernen. Damit hat Ihr geänderter EditText die gleichen Ränder und das gleiche Erscheinungsbild wie normale EditText-Felder. Wenn Sie den Hintergrund einfach auf Null setzen, gehen die Ränder verloren.
Peri Hartman

124
Verwenden Sie dies:android:background="@android:color/transparent"
dd619

3
Was ist, wenn ich bereits einen Hintergrund mit einer anderen Farbe habe, sagen wir grau, wie kann man in diesem Fall Unterstriche / Unterstreichungen entfernen?
Narendra Singh

6
In Android 19 android:background="@android:color/transparent"verursacht die Verwendung das gleiche Problem mit dem Verlust von Margen ... Gibt es irgendwo ein Beispiel dafür, dass jemand ein solches benutzerdefiniertes Zeichen erstellt?
Anti Earth

2
Wie können wir programmgesteuert in Java arbeiten?
Jagdish

100

Setzen Sie den Hintergrund auf null.

android:background="@null"

2
Das ist dasselbe wie background = "# 00000000". Funktioniert nicht wirklich.
Peri Hartman

14
Das hat bei mir funktioniert, aber ich habe es getan, android:background="@android:color/transparentweil @nulles beängstigend ist.
Dick Lucas

3
@ Richard warum ist @nullbeängstigend?
Michael

@null zeigt an, dass kein Hintergrund vorhanden ist. Wenn wir background = "# 00000000" angeben, wird ein weißer Hintergrund mit dem Alpha-Wert "0" gezeichnet.
Vinayak V Naik

2
"@null" verbirgt auch den blinkenden Cursor, "@android: color / transparent" nicht.
Lukas Novak

37

Sie können einstellen , EditText‚s - backgroundTintWert auf eine bestimmte Farbe. Wenn Sie eine transparente Farbe festlegen, sollte die Unterleiste verschwunden sein.

android:backgroundTint="@color/Transparent"

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

Sie können dies jedoch in Api v21(Lollipop)oder höher verwenden


Dies ist viel besser als den Hintergrund der gesamten Ansicht zu ändern (wie andere Antworten vermuten lassen)
Alex Semeniuk

26

Bitte stellen Sie Ihren Edittext-Hintergrund als ein

android:background="#00000000"

Es wird klappen.


3
Es wird irgendwie funktionieren, aber nicht richtig. Wenn Sie einfach den Hintergrund entfernen, verlieren Sie auch die Ränder um das Feld - sie sind Teil des Standardhintergrunds. Die richtige Lösung besteht darin, einen anderen Hintergrund zu ersetzen, der einfach keine Unterleiste enthält, wie @ ha1ogen vorschlägt
Peri Hartman,

1
Wie man dies programmatisch rückgängig macht
Tushar Narang

23

Sie können dies programmgesteuert tun, indem Sie setBackgroundResource:

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

Ich weiß nicht warum, aber es funktioniert nicht. Die Linie ist immer noch da
Syed Hissaan

15

Was ich getan habe, war, eine Form zum Zeichnen zu erstellen und diese als Hintergrund festzulegen:

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

Hinweis: Ich habe tatsächlich @dimenund @colorWerte für die Firelds verwendet, aber ich habe die Formdatei hier aus Gründen der Übersichtlichkeit vereinfacht.


1
Dies ist auch eine sehr gute Option. Es ist eine Variation beim Festlegen eines benutzerdefinierten Zeichens.
Peri Hartman

15

Verwenden einer der beiden Eigenschaften:

android:background="@null"

ODER

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

arbeitete für mich, um die Unterstreichung des EditText zu verbergen.

Beachten Sie jedoch, dass es dann zu einem Abstandsproblem mit dem TextInputLayout kommt, das ich umgibt EditText


1
Das Problem mit dem Abstand ergibt sich aus dem Fehlerlayout. Um dies zu beheben, setzen Sie die errorEnabled-Eigenschaft des TextInputLayout auf false app: errorEnabled = "false"
Ulbo

12

Hier ist eine Möglichkeit, es auszublenden, ohne die Standardauffüllung zu ruinieren:

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

Verwendungszweck:

editText.setViewBackgroundWithoutResettingPadding(null)

Aktualisieren:

Wenn Sie feststellen, dass Sie immer null übergeben, können Sie dies in der Methode kodifizieren (und dann können Sie EditText selbst genauso gut überladen).

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

Diese Antwort ist perfekt und sollte akzeptiert werden. Es kann den Hintergrund entfernen, ohne die Standardauffüllung zu entfernen.
Pankaj Kumar

6

Sie müssen auch eine minWidth einstellen, sonst verschwindet der Cursor, wenn der Text leer ist.

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

6

In meinem Fall habe ich einen benutzerdefinierten Hintergrund zum Bearbeiten von Text verwendet, daher war es nicht die Lösung für mich, den Hintergrund auf @null oder den Farbton auf transparent zu setzen, also habe ich einen kleinen Streich gespielt, der für mich sehr gut funktioniert hat

android:inputType="textVisiblePassword"

und es erledigt die Arbeit ziemlich gut. Es ist nicht die optimale Lösung, aber es funktioniert


1
Ich mag dies in Verbindung mit transparentem Hintergrund, weil es die Leiste verbirgt, die beim Tippen unter dem Text angezeigt wird - alles, was ich möchte, ist der Text, keine Verzierungen.
19Craig

1
Diese Antwort ist die einzige, die für mich funktioniert hat, da meine Edittext-Felder programmgesteuert erstellt wurden und jeweils unterschiedliche Hintergrundfarben haben, sodass der Hintergrund nicht null sein kann und sich auf die Hintergrundfarbe der Eltern
stützt

5

Ich habe so etwas, was sehr, sehr nützlich ist:

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

Dabei ist generalEditText mein EditText und die Farbe Weiß ist:

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

Dadurch wird die Polsterung nicht entfernt und Ihr EditText bleibt unverändert. Nur die untere Zeile wird entfernt. Manchmal ist es sinnvoller, dies so zu tun.

Wenn Sie android:background="@null"so viele verwenden, wie vorgeschlagen, verlieren Sie die Polsterung und EditText wird kleiner. Zumindest war es mein Fall.

Eine kleine Randnotiz ist: Wenn Sie den Hintergrund auf Null setzen und den oben angegebenen Java-Code ausprobieren, stürzt Ihre App direkt nach der Ausführung ab. (weil es den Hintergrund bekommt, aber null ist.) Es mag offensichtlich sein, aber ich denke, es ist wichtig, darauf hinzuweisen.


4

Ich habe das Merkwürdigste entdeckt! Wenn Sie die nullDatenbindung verwenden: android:background="@{null}"

Dann wird nicht nur der Hintergrund entfernt, sondern die Ansicht enthält immer noch den Abstand, der aus dem Standardhintergrund berechnet wurde. Aus irgendeinem Grund löscht die verzögerte Null-Einstellung nicht die Auffüllung des vorherigen bg ..? Die Auffüllung in der Ansicht ist links / oben / rechts 4dp, unten 13dp (ab Emulatorstufe 21).

Möglicherweise wird nicht auf allen API-Ebenen das gleiche Endergebnis erzielt. Seien Sie also vorsichtig! Jemand sagt mir, ob Sie dies testen und es für zuverlässig halten. (Beachten Sie auch, dass das untere Polster aufgrund der Unterstreichung im Original hervorsteht. Sie sollten es also wahrscheinlich im XML ändern oder im Code zurücksetzen, nachdem es auf das gleiche obere Niveau geladen wurde ...


4

Wenn Ihr Bearbeitungstext bereits einen Hintergrund hat, können Sie Folgendes verwenden.

android:textCursorDrawable="@null"

Obwohl dies die Frage nicht löst, hat es mir geholfen.
Rubén Viguera

4

Wenn Sie möchten, dass dies alle Instanzen von EditText und alle von ihm geerbten Klassen betrifft, sollten Sie in Ihrem Design den Wert für das Attribut editTextBackground festlegen.

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

Ein Beispiel für das von mir verwendete Zeichen ist:

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

Dies ist eine leicht modifizierte Version der Standardimplementierung für das Materialdesign.

Wenn es angewendet wird, entfernt Ihr gesamter EditText die Unterstreichung in der gesamten App, und Sie müssen den Stil nicht manuell auf jeden einzelnen anwenden.



2

Sie können auch einen STIL für Ihren editText definieren, um alle Eigenschaften gemeinsam zu gruppieren. Es ist sehr leistungsfähig, wenn Sie mehrere Texte bearbeiten müssen, die das Verhalten haben müssen

Fügen Sie den Code in res / values ​​/ styles.xml ein

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

Danach müssen Sie es nur noch in Ihrem editText aufrufen

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

1

Programmatisch verwenden: editText.setBackground(null)

Vom xmlGebrauch:android:background="@null"



1

android: inputType = "textVisiblePassword | textMultiLine" android: background = "@ android: color / transparent"

... es ist nicht die optimale Lösung, aber es funktioniert.


0

Setzen Sie den Hintergrund auf null

android:background="@null" in your xml 

0

In meinem Fall editText.setBackgroundResource(R.color.transparent);ist am besten.

Die Standardauffüllung wird nicht entfernt, nur unter der Leiste.

R.color.transparent = #00000000


0

Wenn Sie Hintergrund verwenden, müssen Sie dieses Tag verwenden

android:testCursorDrawable="@null" 

0

Um sowohl die Ränder als auch die Hintergrundfarbe beizubehalten, verwenden Sie:

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>

Text bearbeiten:

<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" />
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.