Jak ukryć podbicie w EditText

496

Jak mogę ukryć pasek podrzędny EditText (wiersz zachęty z małymi serifami na końcach)?

Może być lepszy sposób na robienie tego, co chcę: mam układ z EditText. Zwykle wyświetla się dobrze, gdzie użytkownik może go dotknąć i rozpocząć wprowadzanie lub edycję tekstu.

Czasami jednak chciałbym użyć tego samego układu (upraszcza inną logikę), aby wyświetlać te same dane w trybie tylko do odczytu. Chcę, aby prezentacja była podobna - powinna mieć tę samą wysokość i tę samą czcionkę, ale nie powinna mieć podbicia.

Jako miarę stop-gap zamierzam to zaimplementować, usuwając EditText i podstawiając TextView. Myślę, że da to pożądane rezultaty, ale wydaje się, że rondo jest drogim sposobem na zrobienie czegoś, co powinno być łatwe do zrobienia poprzez zmianę atrybutów.

Peri Hartman
źródło
Możliwy duplikat? stackoverflow.com/questions/5478109/…
Mohamed Taher Alrefaie

Odpowiedzi:

1052

Możesz ustawić EditTextniestandardową przezroczystą szufladę lub po prostu użyć

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

lub

android:background="@null"

lub programowo

editText.setBackgroundResource(android.R.color.transparent);
ha1ogen
źródło
7
Najlepszą odpowiedzią, jak mówi ha1ogen, jest stworzenie niestandardowego rysunku. Zacznij od 9-łatki używanej do normalnych pól EditText. Zmodyfikuj go, aby usunąć pasek dolny i inne grafiki, których nie chcesz. Dzięki temu zmodyfikowany tekst EditText będzie miał takie same marginesy i ogólny wygląd jak zwykłe pola EditText. Jeśli po prostu ustawisz tło na zero, spowoduje to utratę marginesów.
Peri Hartman,
124
użyj tego:android:background="@android:color/transparent"
dd619
3
co jeśli mam już tło innego koloru, powiedzmy szary, jak w takim przypadku usunąć podkreślenie / podkreślenie?
Narendra Singh,
6
W Androidzie 19 używanie android:background="@android:color/transparent"powoduje ten sam problem utraty marginesów ... Czy jest gdzieś przykład kogoś, kto tworzy taki niestandardowy wyciąg?
Anti Earth
2
Jak możemy zrobić programowo w java?
jagdish
100

Ustaw tło na zero.

android:background="@null"
Vinayak V Naik
źródło
2
To to samo co tło = "# 00000000". Naprawdę nie działa.
Peri Hartman,
14
To działało dla mnie, ale skończyło się na tym, android:background="@android:color/transparentże @nulljest przerażające.
Dick Lucas,
3
@ Richard, dlaczego jest @nullprzerażający?
Michael,
@ null wskazuje, że tło nie istnieje. Jeśli podamy background = "# 00000000", narysuje białe tło z wartością alfa "0".
Vinayak V Naik
2
„@ null” ukrywa również migający kursor, „@ android: color / transparent” nie.
Lukas Novak
37

Można ustawić EditText„s backgroundTintwartość do określonego koloru. Jeśli ustawisz kolor przezroczysty, podbródek powinien zniknąć.

android:backgroundTint="@color/Transparent"

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

Ale możesz użyć tego w wersji Api v21(Lollipop)wyższej lub wyższej

Yasin Kaçmaz
źródło
Jest to o wiele lepsze niż zmiana tła całego widoku (jak sugerują inne odpowiedzi)
Alex Semeniuk
26

Ustaw tło edytowanego tekstu jako

android:background="#00000000"

To będzie działać.

Kishore Kumar
źródło
3
Będzie to trochę działało, ale nie poprawnie. Jeśli po prostu usuniesz tło, stracisz również marginesy wokół pola - są one częścią domyślnego tła. Właściwym rozwiązaniem jest zastąpienie innego tła, które po prostu nie ma podbicia, jak sugeruje @ ha1ogen
Peri Hartman,
1
Jak cofnąć to programowo
Tushar Narang
23

Możesz to zrobić programowo, używając setBackgroundResource:

editText.setBackgroundResource(android.R.color.transparent);
Roberto
źródło
nie wiem dlaczego, ale to nie działa. linia wciąż tam jest
Syed Hissaan
15

Stworzyłem Drawable Shape i ustawiłem to jako tło:

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

Uwaga: faktycznie użyłem @dimeni @colorwartości dla firelds, ale uprościłem tutaj plik kształtu dla większej przejrzystości.

Paul LeBeau
źródło
1
Jest to również doskonale dobra opcja. Jest to wariant ustawienia niestandardowego rysunku.
Peri Hartman
15

Za pomocą dowolnej właściwości:

android:background="@null"

LUB

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

pracował dla mnie, aby ukryć podkreślenie EditText.

Należy jednak pamiętać, że powoduje to problem z odstępami w TextInputLayout, który otaczam EditText

AjayCodes
źródło
1
Problem z odstępami wynika z układu błędu. Aby to naprawić, ustaw właściwość errorEnabled obiektu TextInputLayout na wartość false: errorEnabled = "false"
Ulbo
12

Oto sposób, aby go ukryć bez rujnowania domyślnego wypełnienia:

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

stosowanie:

editText.setViewBackgroundWithoutResettingPadding(null)

Aktualizacja:

Jeśli okaże się, że zawsze podajesz null, możesz to skodyfikować w metodzie (a wtedy równie dobrze możesz przeciążić sam 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()
programista Androida
źródło
Ta odpowiedź jest idealna i powinna zostać zaakceptowana. Może usunąć tło bez usuwania domyślnego wypełnienia.
Pankaj Kumar
6

Musisz także ustawić minWidth, w przeciwnym razie kursor zniknie, jeśli tekst będzie pusty.

        <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"
            />
żywa miłość
źródło
6

W moim przypadku użyłem niestandardowego tła do edycji tekstu, więc ustawienie tła na @ null lub ustawienie odcienia na przezroczyste nie było dla mnie rozwiązaniem, więc zagrałem w małą sztuczkę, która działała dla mnie bardzo ładnie, właśnie ustawiłem

android:inputType="textVisiblePassword"

i robi to całkiem dobrze. nie jest to optymalne rozwiązanie, ale działa

Harvinder Singh
źródło
1
Podoba mi się to w połączeniu z przezroczystym tłem, ponieważ ukrywa pasek, który pojawia się pod tekstem podczas pisania - wszystko, czego chcę, to tekst, bez ozdób.
19Craig
1
Ta odpowiedź jest jedyną, która działała dla mnie, ponieważ moje pola edycyjne są tworzone programowo i każdy z nich ma różne kolory tła, więc tło nie może być puste i polegać na kolorze tła rodziców
Sharone Lev
5

Mam coś takiego, co jest bardzo przydatne:

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

gdzie generalEditText to mój EditText, a kolor biały to:

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

Nie spowoduje to usunięcia dopełnienia, a tekst EditText pozostanie niezmieniony. Tylko linia na dole zostanie usunięta. Czasami bardziej przydatne jest zrobienie tego w ten sposób.

Jeśli użyjesz android:background="@null"tyle sugerowanych, tracisz dopełnienie, a EditText staje się mniejszy. Tak przynajmniej było w moim przypadku.

Mała uwaga: jeśli ustawisz tło na zero i wypróbujesz kod java, który podałem powyżej, twoja aplikacja ulegnie awarii natychmiast po uruchomieniu. (ponieważ pobiera tło, ale jest zerowe). Może to być oczywiste, ale myślę, że wskazanie tego jest ważne.

bengongon97
źródło
4

Odkryłem najbardziej ciekawą rzecz! Jeśli ustawisz nullużywanie powiązania danych: android:background="@{null}"

Następnie nie tylko tło jest usuwane, ale w widoku nadal znajduje się wypełnienie, które zostało obliczone na tle domyślnym. Więc z jakiegoś powodu ustawienie odroczonego zerowania nie usuwa dopełnienia z poprzedniego bg ..? Dopełnienie widoku to lewy / górny / prawy 4dp, dolny 13dp (z poziomu emulatora 21).

Może nie mieć tego samego wyniku końcowego na wszystkich poziomach API, więc uważaj! Ktoś mi powie, jeśli to przetestujesz i okaże się wiarygodny. (Zauważ też, że dolne wypełnienie wystaje z powodu podkreślenia, które było w oryginale. Więc prawdopodobnie będziesz chciał go zmienić w pliku XML lub zresetować w kodzie po załadowaniu do równej góry ...

androidguy
źródło
4

jeśli Twój tekst edycji ma już tło, możesz użyć następującego.

android:textCursorDrawable="@null"
AKASH WANGALWAR
źródło
Chociaż to nie rozwiązuje pytania, było dla mnie pomocne.
Rubén Viguera,
4

Jeśli chcesz, aby wpłynęło to na wszystkie instancje EditText i dowolną dziedziczącą po nim klasę, powinieneś ustawić w swoim motywie wartość atrybutu editTextBackground.

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

Przykładem rysunku, którego używam, jest:

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

Jest to nieznacznie zmodyfikowana wersja domyślnej implementacji projektu materiału.

Po zastosowaniu spowoduje, że cały tekst EditText usunie podkreślenie w aplikacji i nie będziesz musiał ręcznie stosować stylu do każdego z nich.

kingargyle
źródło
4

Po prostu użyj tego

 editText.setBackgroundColor(Color.TRANSPARENT);
prashant kute
źródło
2

Możesz także zdefiniować STYL dla swojego editText, abyś mógł przegrupować wszystkie wspólne właściwości. Jest bardzo potężny, jeśli musisz edytować wiele tekstów, które wymagają zachowania

Umieść kod w res / wartości / 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>

Następnie wystarczy wywołać go w 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" />
Dagnogo Jean-François
źródło
1

Programowo użyj: editText.setBackground(null)

Od xmlużycia:android:background="@null"

Shubham Kaushik
źródło
1
android:background="@android:color/transparent"

Lub

android:background="@null"
Wyjątek wskaźnika zerowego
źródło
1

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

... to nie jest optymalne rozwiązanie, ale działa.

Carles Garrigues
źródło
0

Ustaw tło na zero

android:background="@null" in your xml 
Jocelin
źródło
0

W moim przypadku editText.setBackgroundResource(R.color.transparent);jest najlepszy.

Nie usuwa domyślnego wypełnienia tuż pod paskiem.

R.color.transparent = #00000000

HJ Song
źródło
0

jeśli używasz tła, musisz użyć tego tagu

android:testCursorDrawable="@null" 
ATIQ UR REHMAN
źródło
0

Aby zachować zarówno marginesy, jak i kolor tła:

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>

Edytować tekst:

<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" />
itabdullah
źródło