Como ocultar barra inferior no EditText


496

Como ocultar a barra inferior do EditText (a linha de prompt com pequenas serifas no final)?

Pode haver uma maneira melhor de fazer o que eu quero: eu tenho um layout com um EditText. Normalmente, isso é exibido bem onde o usuário pode tocar nele e começar a inserir ou editar o texto.

Às vezes, porém, eu gostaria de usar o mesmo layout (simplifica outra lógica) para exibir os mesmos dados de maneira somente leitura. Quero que a apresentação seja semelhante - ela deve ter a mesma altura e a mesma fonte, mas não a barra inferior.

Como uma medida de intervalo, vou implementar isso removendo o EditText e substituindo um TextView. Eu acho que isso dará os resultados desejados, mas parece uma maneira indireta de fazer algo que deve ser fácil, alterando os atributos.


Respostas:


1052

Você pode definir EditTextum drawable transparente personalizado ou apenas usar

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

ou

android:background="@null"

ou programaticamente

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

7
A melhor resposta, como diz ha1ogen, é criar um desenho personalizado. Comece com o patch 9 que é usado para os campos normais EditText. Modifique-o para remover a barra inferior e outros gráficos que você não deseja. Com isso, o EditText modificado terá as mesmas margens e aparência geral dos campos normais do EditText. Se você simplesmente definir o plano de fundo como nulo, ele perderá as margens.
Peri Hartman #

124
use isto:android:background="@android:color/transparent"
dd619 02/07/2015

3
e se eu já tiver um fundo de outra cor, digamos cinza, como remover underbar / underline nesse caso?
Narendra Singh

6
No Android 19, o uso android:background="@android:color/transparent"causa o mesmo problema de perda de margens ... Existe algum exemplo de alguém criando um drawable personalizado?
Anti Earth

2
Como podemos fazer programaticamente em java?
Jagdish #

100

Defina o plano de fundo como nulo.

android:background="@null"

2
É o mesmo que background = "# 00000000". Realmente não funciona.
Peri Hartman às

14
Isso funcionou para mim, mas acabei fazendo android:background="@android:color/transparentporque @nullé assustador.
Dick Lucas

3
@ Richard Por que é @nullassustador?
Michael

@ null indicará que não existe plano de fundo. Se especificarmos background = "# 00000000", ele desenhará um fundo branco com o valor alfa "0".
Vinayak V Naik

2
"@null" também oculta o cursor piscante, "@android: color / transparent" não.
Lukas Novak

37

Você pode definir EditTexto backgroundTintvalor de uma cor específica. Se você definir cores transparentes, a barra inferior deverá desaparecer.

android:backgroundTint="@color/Transparent"

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

Mas você pode usar isso em Api v21(Lollipop)ou superior


Isto é muito melhor do que mudar de fundo de toda a vista (como outras respostas sugerem)
Alex Semeniuk

26

Defina seu plano de fundo do edittext como

android:background="#00000000"

Vai funcionar.


3
Vai funcionar meio que, mas não corretamente. Se você simplesmente remover o plano de fundo, também perderá as margens ao redor do campo - elas fazem parte do plano de fundo padrão. A solução certa é substituir um fundo diferente que simplesmente não têm o underbar nele, como @ ha1ogen sugere
Peri Hartman

1
Como desfazer isso programaticamente
Tushar Narang

23

Você pode fazer isso programaticamente usando setBackgroundResource:

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

não sei por que, mas não funciona. a linha ainda está lá
Syed Hissaan

15

O que fiz foi criar um drawable Shape e defini-lo como plano de fundo:

<?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: Eu realmente utilizados @dimene @coloros valores para os firelds, mas eu simplificou o arquivo de forma aqui para maior clareza.


1
Esta é uma opção perfeitamente boa também. É uma variação na configuração de um drawable personalizado.
Peri Hartman

15

Usando qualquer propriedade:

android:background="@null"

OU

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

trabalhou para eu esconder o sublinhado do EditText.

No entanto, observe que isso causa um problema de espaçamento com o TextInputLayout que envolvi o EditText


1
O problema de espaçamento vem do layout do erro. Para corrigir isso, defina a propriedade errorEnabled do TextInputLayout como false app: errorEnabled = "false"
#

12

Aqui está uma maneira de escondê-lo, sem arruinar o preenchimento padrão:

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

uso:

editText.setViewBackgroundWithoutResettingPadding(null)

Atualizar:

Se você estiver sempre passando nulo, poderá codificá-lo no método (e poderá sobrecarregar o próprio 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()

Essa resposta é perfeita e deve ser aceita. Ele pode remover o plano de fundo sem remover o preenchimento padrão.
Pankaj Kumar

6

Você também deve definir uma minWidth, caso contrário, o cursor desaparecerá se o texto estiver vazio.

        <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

No meu caso, eu estava usando o plano de fundo personalizado para editar o texto, portanto, definir o plano de fundo como @ nulo ou definir o tom como transparente não era a solução para mim, então joguei um pequeno truque que funcionou muito bem para mim.

android:inputType="textVisiblePassword"

e faz o trabalho muito bem .. não é a solução ideal, mas funciona


1
Gosto disso em conjunto com o plano de fundo transparente, porque oculta a barra que aparece abaixo do texto durante a digitação - tudo o que quero é o texto, sem adornos.
19Craig

1
Esta resposta é o único que trabalhou para mim desde os meus caixas EditText são criados através de programação e cada um tem diferentes cores de fundo para que o fundo não pode ser nulo e contam com a cor pais fundo
Sharone Lev

5

Eu tenho algo parecido com isto que é muito, muito útil:

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

onde generalEditText é meu EditText e a cor branca é:

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

Isso não removerá o preenchimento e o EditText permanecerá como está. Somente a linha na parte inferior será removida. Às vezes é mais útil fazer assim.

Se você usar android:background="@null" o máximo de sugestões, você perde o preenchimento e o EditText fica menor. Pelo menos, foi o meu caso.

Uma pequena observação: se você definir o fundo como nulo e tentar o código java que forneci acima, seu aplicativo falhará imediatamente após executá-lo. (porque obtém o plano de fundo, mas é nulo.) Pode ser óbvio, mas acho importante salientar.


4

Eu descobri a coisa mais curiosa! Se você configurá-lo paranull usar Ligação de Dados: android:background="@{null}"

Além disso, o fundo não é removido, mas a exibição ainda possui o preenchimento calculado a partir do fundo padrão. Portanto, por algum motivo, a configuração nula adiada não limpa o preenchimento da página anterior ..? O preenchimento na exibição é esquerdo / superior / direito 4dp, 13dp inferior (do nível 21 do emulador).

Pode não ter o mesmo resultado final em todos os níveis da API, então cuidado! Alguém me diga se você testar isso e achar confiável. (Observe também que esse preenchimento inferior se destaca por causa do sublinhado que estava no original. Portanto, você provavelmente desejará alterá-lo no XML ou redefini-lo no código depois de carregado para igual ao topo ...


4

se o seu texto de edição já tiver um plano de fundo, você poderá usar os seguintes.

android:textCursorDrawable="@null"

Embora isso não resolva a questão, foi de grande ajuda para mim.
Rubén Viguera

4

Se você deseja que isso afete todas as instâncias do EditText e qualquer classe que herda dele, defina em seu tema o valor do atributo, editTextBackground.

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

Um exemplo do drawable que eu uso é:

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

Esta é uma versão ligeiramente modificada da implementação padrão do design do material.

Quando aplicado, todo o EditText remove o sublinhado do aplicativo, e você não precisa aplicar o estilo manualmente a todos.



2

Você também pode definir um ESTILO para o seu editText para poder reagrupar todas as propriedades em comum. É muito poderoso se você precisar editar vários textos que precisam ter o comportamento

Coloque o código em 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>

Depois disso, você só precisa chamá-lo em seu 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

Programaticamente usar: editText.setBackground(null)

De xmluso:android:background="@null"



1

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

... não é a solução ideal, mas funciona.


0

Definir plano de fundo como nulo

android:background="@null" in your xml 

0

No meu caso, editText.setBackgroundResource(R.color.transparent);é melhor.

Não remove o preenchimento padrão, logo abaixo da barra.

R.color.transparent = #00000000


0

se você estiver usando plano de fundo, deverá usar esta tag

android:testCursorDrawable="@null" 

0

Para manter as margens e a cor do plano de fundo, use:

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>

Editar texto:

<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" />
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.