Come nascondere underbar in EditText


496

Come posso nascondere la barra di modifica EditText (la riga di prompt con piccoli serif alle estremità)?

Potrebbe esserci un modo migliore per fare quello che voglio: ho un layout con un EditText. Normalmente, questo mostra bene dove l'utente può toccarlo e iniziare a inserire o modificare il testo.

A volte, tuttavia, vorrei utilizzare lo stesso layout (semplifica altre logiche) per visualizzare gli stessi dati in sola lettura. Voglio che la presentazione sia simile: dovrebbe avere la stessa altezza e lo stesso carattere, ma non la barra inferiore.

Come misura stop-gap, ho intenzione di implementarlo rimuovendo EditText e sostituendo un TextView. Penso che darà i risultati desiderati, ma sembra una rotonda un modo costoso per fare qualcosa che dovrebbe essere facile da fare cambiando gli attributi.


Risposte:


1052

Puoi impostare l' EditTextopzione per avere un disegno trasparente personalizzato o semplicemente usare

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

o

android:background="@null"

o programmaticamente

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

7
La risposta migliore, come dice ha1ogen, è quella di creare un disegno personalizzato. Inizia con la 9-patch utilizzata per i normali campi EditText. Modificalo per rimuovere la barra inferiore e altri elementi grafici che non desideri. Con questo, il tuo EditText modificato avrà gli stessi margini e l'aspetto generale dei normali campi EditText. Se si imposta semplicemente lo sfondo su null, si perderanno i margini.
Peri Hartman,

124
usare questo:android:background="@android:color/transparent"
dd619,

3
cosa succede se ho già uno sfondo di altro colore, diciamo grigio, come rimuovere la barra inferiore / la sottolineatura in quel caso?
Narendra Singh,

6
In Android 19, l'utilizzo android:background="@android:color/transparent"causa lo stesso problema di perdita di margini ... Esiste un esempio di qualcuno che crea un tale disegno personalizzato?
Anti Earth

2
Come possiamo fare a livello di codice in Java?
Jagdish

100

Imposta lo sfondo su null.

android:background="@null"

2
È lo stesso di background = "# 00000000". Non funziona davvero.
Peri Hartman,

14
Questo ha funzionato per me, ma alla fine l'ho fatto android:background="@android:color/transparentperché @nullfa paura.
Dick Lucas,

3
@Richard perché è @nullspaventoso?
Michael,

@null indicherà che non esiste alcun background. Se si specifica background = "# 00000000", verrà disegnato uno sfondo bianco con valore alfa "0".
Vinayak V Naik

2
"@null" nasconde anche il cursore lampeggiante, "@android: color / transparent" no.
Lukas Novak,

37

È possibile impostare EditTextil backgroundTintvalore su un colore specifico. Se si imposta il colore trasparente, la barra inferiore dovrebbe sparire.

android:backgroundTint="@color/Transparent"

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

Ma puoi usarlo in Api v21(Lollipop)o superiore


È molto meglio che cambiare lo sfondo dell'intera vista (come suggeriscono altre risposte)
Alex Semeniuk,

26

Si prega di impostare lo sfondo edittext come

android:background="#00000000"

Funzionerà.


3
Funzionerà in qualche modo, ma non correttamente. Se rimuovi semplicemente lo sfondo, perderai anche i margini attorno al campo: fanno parte dello sfondo predefinito. La soluzione giusta è quella di sostituire uno sfondo diverso che semplicemente non ha la parte inferiore, come suggerisce @ ha1ogen
Peri Hartman

1
Come annullare questo programma
Tushar Narang,

23

Puoi farlo a livello di codice usando setBackgroundResource:

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

non so perché, ma non funziona. la linea è ancora lì
Syed Hissaan,

15

Quello che ho fatto è stato creare un disegno Shape e impostarlo come sfondo:

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

Nota: ho effettivamente utilizzato @dimene @colorvalori per i firelds, ma ho semplificato il file di forma qui per chiarezza.


1
Anche questa è un'ottima opzione. È una variazione sull'impostazione di un disegno personalizzato.
Peri Hartman,

15

Utilizzando una delle proprietà:

android:background="@null"

O

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

ha funzionato per me per nascondere la sottolineatura di EditText.

Tuttavia, tieni presente che causa un problema di spaziatura con TextInputLayout che ho circondato EditText


1
Il problema di spaziatura deriva dal layout dell'errore. Per risolvere il problema, imposta la proprietà errorEnabled di TextInputLayout su false app: errorEnabled = "false"
Ulbo

12

Ecco un modo per nasconderlo, senza rovinare l'imbottitura predefinita:

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

utilizzo:

editText.setViewBackgroundWithoutResettingPadding(null)

Aggiornare:

Se ti ritrovi a passare sempre null, puoi codificarlo nel metodo (e quindi potresti anche sovraccaricare EditText stesso)

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

Questa risposta è perfetta e dovrebbe essere accettata. Può rimuovere lo sfondo senza rimuovere il riempimento predefinito.
Pankaj Kumar

6

Devi anche impostare un minWidth, altrimenti il ​​cursore scompare se il testo è vuoto.

        <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

Nel mio caso stavo usando uno sfondo personalizzato per modificare il testo, quindi impostare lo sfondo su @null o impostare la tonalità su trasparente non era la soluzione per me, quindi ho giocato un piccolo trucco che ha funzionato molto bene per me, ho appena impostato

android:inputType="textVisiblePassword"

e fa il lavoro abbastanza bene .. non è la soluzione ottimale ma funziona


1
Mi piace questo in combinazione con uno sfondo trasparente perché nasconde la barra che appare sotto il testo durante la digitazione: tutto ciò che voglio è il testo, senza ornamenti.
aprile

1
Questa risposta è l'unica che ha funzionato per me poiché le mie caselle edittext sono create in modo programmatico e ognuna ha colori di sfondo diversi, quindi lo sfondo non può essere nullo e fare affidamento sul colore di sfondo dei genitori
Sharone Lev

5

Ho qualcosa del genere che è molto molto utile:

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

dove generalEditText è il mio EditText e il colore bianco è:

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

Questo non rimuoverà l'imbottitura e il tuo EditText rimarrà così com'è. Verrà rimossa solo la linea in fondo. A volte è più utile farlo in questo modo.

Se usi android:background="@null"tanti suggerimenti, perdi l'imbottitura e EditText diventa più piccolo. Almeno, è stato il mio caso.

Una piccola nota a margine è se imposti lo sfondo null e provi il codice java che ho fornito sopra, la tua app andrà in crash subito dopo averla eseguita. (perché ottiene lo sfondo ma è nullo.) Potrebbe essere ovvio ma penso che sottolinearlo sia importante.


4

Ho scoperto la cosa più curiosa! Se lo si imposta per l' nullutilizzo dell'associazione dati: android:background="@{null}"

Quindi non solo viene rimosso lo sfondo, ma la vista ha ancora il riempimento che è stato calcolato dallo sfondo predefinito. Quindi, per qualche motivo, l'impostazione null differita non cancella il riempimento dal precedente bg ..? L'imbottitura nella vista è sinistra / superiore / destra 4dp, inferiore 13dp (dal livello 21 dell'emulatore).

Potrebbe non avere lo stesso risultato finale su tutti i livelli API, quindi attenzione! Qualcuno mi dica se lo testate e lo trovate affidabile. (Si noti inoltre che quell'imbottitura inferiore sporge a causa di quella sottolineatura che era nell'originale. Quindi probabilmente vorrai cambiarlo nell'XML o ripristinarlo nel codice dopo che è stato caricato in alto uguale ...


4

se il testo di modifica ha già uno sfondo, è possibile utilizzare quanto segue.

android:textCursorDrawable="@null"

Anche se questo non risolve la domanda, mi è stato di aiuto.
Rubén Viguera,

4

Se si desidera che ciò influisca su tutte le istanze di EditText e su qualsiasi classe che eredita da esso, è necessario impostare nel tema il valore dell'attributo, editTextBackground.

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

Un esempio del disegno che utilizzo è:

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

Questa è una versione leggermente modificata di ciò che è l'implementazione di progettazione materiale predefinita.

Una volta applicato, tutto il tuo EditText rimuoverà la sottolineatura in tutta l'app e non dovrai applicare lo stile a tutti manualmente.


4

Usa semplicemente questo

 editText.setBackgroundColor(Color.TRANSPARENT);

2

Puoi anche definire uno STILE per il tuo editText in modo da raggruppare tutte le proprietà in comune. È molto potente se devi modificare più testi che devono avere il comportamento

Inserisci il codice in res / valori / 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>

Dopodiché devi solo chiamarlo nel tuo 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" />

1

Utilizzare a livello di programmazione: editText.setBackground(null)

Dall'uso xml:android:background="@null"



1

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

... non è la soluzione ottimale ma funziona.


0

Imposta lo sfondo su null

android:background="@null" in your xml 

0

Nel mio caso, editText.setBackgroundResource(R.color.transparent);è il migliore.

Non rimuove il riempimento predefinito, appena sotto la barra.

R.color.transparent = #00000000


0

se si utilizza lo sfondo, è necessario utilizzare questo tag

android:testCursorDrawable="@null" 

0

Per conservare sia i margini che il colore di sfondo usare:

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>

Modifica il testo:

<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" />
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.