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.


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

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"

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


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


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

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.


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


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

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

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


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.


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


4

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

android:textCursorDrawable="@null"

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.



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



1

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

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



0

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

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

R.color.transparent = #00000000



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" />
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.