Як приховати під панелі в EditText


496

Як я можу приховати панель редагування EditText (рядок підказок з невеликими серіфами на кінцях)?

Можливо, буде кращий спосіб зробити те, що я хочу: у мене є макет з EditText. Як правило, це відображається добре, коли користувач може натиснути на нього і почати вводити чи редагувати текст.

Однак іноді я хотів би використовувати один і той же макет (спрощує іншу логіку) для відображення одних і тих же даних лише для читання. Я хочу, щоб презентація була схожою - вона повинна мати однакову висоту і однаковий шрифт, але не мати нижньої смуги.

Як міру стоп-розриву я збираюся реалізувати це, видаливши EditText і замінивши TextView. Я думаю, що це дасть бажані результати, але здається, що навколо цього дорогого способу зробити щось, що повинно бути легко, змінивши атрибути.


Відповіді:


1052

Ви можете встановити EditTextспеціальний прозорий малюнок або просто використовувати

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

або

android:background="@null"

або програмно

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

7
Найкраща відповідь, як каже ha1ogen, - це зробити користувальницький малюнок. Почніть з 9-патча, який використовується для звичайних полів EditText. Змініть його, щоб викреслити нижню панель та іншу графіку, яку ви не хочете. При цьому ваш змінений EditText матиме ті ж поля та загальний вигляд, що і звичайні поля EditText. Якщо ви просто встановите фон на нуль, він втратить поля.
Пері Хартман

124
скористайтеся цим:android:background="@android:color/transparent"
dd619

3
що робити, якщо у мене вже є фон іншого кольору, давайте скажемо сірий, як у цьому випадку видалити нижню панель / підкреслення?
Нарендра Сінгх

6
В Android 19 використання android:background="@android:color/transparent"викликає однакову втрату маржин ... Чи є десь приклад того, хто створює такий користувацький малюнок?
Анти Земля

2
Як ми можемо програматично робити в Java?
ягдиш

100

Встановити фон на нуль.

android:background="@null"

2
Це те саме, що background = "# 00000000". Насправді не працює.
Пері Хартман

14
Це працювало для мене, але я закінчився, android:background="@android:color/transparentтому що @nullце страшно.
Дік Лукас

3
@Richard чому це @nullстрашно?
Майкл

@null вкаже, що фон не існує. Якщо ми задамо background = "# 00000000", він намалюватиме білий фон зі значенням альфа "0".
Vinayak V Naik

2
"@null" також ховає миготливий курсор, "@android: color / transparent" немає.
Лукас Новак

37

Ви можете встановити EditText«s backgroundTintзначення певного кольору. Якщо ви встановите прозорий колір, нижня панель повинна піти.

android:backgroundTint="@color/Transparent"

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

Але ви можете використовувати це в Api v21(Lollipop)або вище


Це набагато краще, ніж зміна фону всього перегляду (як підказують інші відповіді)
Олексій Семенюк,

26

Будь ласка, встановіть фон редагування як

android:background="#00000000"

Це спрацює.


3
Це буде сортувати роботу, але не належним чином. Якщо ви просто видалите фон, ви також втратите поля навколо поля - вони є частиною фону за замовчуванням. Правильне рішення - замінити інший фон, у якого просто немає піддону, як підказує @ ha1ogen
Peri Hartman

1
Як це програматично скасувати
Tushar Narang

23

Це можна зробити програмно, використовуючи setBackgroundResource:

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

я не знаю чому, але це не працює. лінія все ще є
Syed Hissaan

15

Що я зробив, це створити форму, що малюється, і встановити її як тло:

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

Примітка: я фактично використовував @dimenі @colorзначення для firelds, але я спростив файл форми для наочності.


1
Це теж непоганий варіант. Це варіант щодо налаштування користувальницького шаблону.
Пері Хартман

15

Використання будь-якого властивості:

android:background="@null"

АБО

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

працював над тим, щоб приховати підкреслення EditText.

Однак зауважте, що це викликає проблему з інтервалом у TextInputLayout, який я оточую EditText


1
Проблема з інтервалом пов'язана з компонуванням помилок. Щоб виправити це, встановіть властивість errorEnabled з TextInputLayout на помилковий додаток: errorEnabled = "false"
Ulbo

12

Ось спосіб приховати це, не руйнуючи прокладки за замовчуванням:

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

використання:

editText.setViewBackgroundWithoutResettingPadding(null)

Оновлення:

Якщо ви виявляєте, що завжди минає null, ви можете зашифрувати це в методі (і тоді ви можете також перевантажити сам 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()

Ця відповідь ідеальна і її слід прийняти. Він може видалити фон, не видаляючи замовчування.
Панкай Кумар

6

Ви також повинні встановити minWidth, інакше курсор зникне, якщо текст порожній.

        <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

У моєму випадку я використовував спеціальний фон для редагування тексту, тому встановлення тла на @null або встановлення відтінку на прозорий не було рішенням для мене, тому я зіграв невеликий трюк, який дуже добре працював для мене, я просто встановив

android:inputType="textVisiblePassword"

і це робить роботу досить добре .. це не оптимальне рішення, але воно працює


1
Мені це подобається в поєднанні з прозорим фоном, тому що він приховує смужку, яка відображається під текстом під час набору тексту - все, що я хочу, це текст, без прикрас.
19Craig

1
Ця відповідь є єдиною, яка працювала для мене, оскільки мої поля редагування створені програмно, і кожен має різні кольори тла, тому фон не може бути нульовим і покладатися на колір тла батьків
Шароне Лев

5

У мене є щось подібне, що дуже дуже корисно:

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

де GeneralEditText - це мій EditText, а білий колір:

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

Це не видалить прокладки, і ваш EditText залишиться таким, як є. Видалятиметься лише лінія внизу. Іноді корисніше це робити так.

Якщо ви використовуєте android:background="@null"стільки запропонованих, ви втратите прокладку, і EditText стає меншим. Принаймні, це було моєю справою.

Невелика бічна примітка - якщо ви встановите фон "null" і спробуєте код Java, який я вказав вище, ваш додаток завершиться збою відразу після його виконання. (тому що він отримує фон, але він є нульовим.) Це може бути очевидним, але я думаю, що його вказівка ​​є важливою.


4

Я відкрив найцікавіше! Якщо встановити його за nullдопомогою прив'язки даних: android:background="@{null}"

Тоді не тільки видаляється фон, але і в представленні все ще є підкладка, яка була розрахована за фоном за замовчуванням. То чомусь відкладений параметр null не очищає прокладку від попереднього bg ..? Накладка на зображенні ліворуч / верх / праворуч 4dp, знизу 13dp (від рівня емулятора 21).

Може не мати однакового кінцевого результату на всіх рівнях API, тому будьте уважні! Хтось скаже мені, якщо ви тестуєте це і вважаєте це надійним. (Також зауважте, що нижня підкладка проступає через підкреслення, яке було в оригіналі. Тому, ймовірно, ви захочете змінити його в XML або скинути його в код після завантаження на рівну верхню ...


4

якщо текст редагування вже є фоном, ви можете використовувати наступне.

android:textCursorDrawable="@null"

Хоча це не вирішує питання, мені це допомогло.
Рубен Вігера

4

Якщо ви хочете, щоб це вплинуло на всі екземпляри EditText та будь-який клас, який успадковує його, тоді слід встановити у своїй темі значення для атрибута editTextBackground.

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

Приклад рисувального я використовую:

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

Це трохи модифікована версія того, що таке дизайн дизайну за замовчуванням.

Якщо застосовано, усі ваші EditText змусять видалити підкреслення в додатку, і вам не доведеться застосовувати стиль до кожного та кожного вручну.



2

Ви також можете визначити STYLE для свого editText, щоб ви могли перегрупувати всі спільні властивості. Це дуже потужно, якщо вам доведеться кілька разів редагувати текст, який повинен мати поведінку

Покладіть код у 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>

Після цього вам просто потрібно зателефонувати в його 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"

... це не оптимальне рішення, але воно працює.



0

У моєму випадку editText.setBackgroundResource(R.color.transparent);найкраще.

Це не видаляє прокладки за замовчуванням, просто під смужкою.

R.color.transparent = #00000000


0

якщо ви використовуєте фон, то ви повинні використовувати цей тег

android:testCursorDrawable="@null" 

0

Щоб зберегти як поля, так і колір фону, використовуйте:

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>

Редагувати текст:

<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" />
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.