Как скрыть подчеркивание в 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. Если вы просто установите фон в null, он потеряет поля.
Пери Хартман

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
@ Ричард, почему это @nullстрашно?
Майкл

@null будет указывать на отсутствие фона. Если мы укажем background = "# 00000000", он будет рисовать белый фон с альфа-значением "0".
Vinayak V Naik

2
«@null» также скрывает мигающий курсор, «@android: цвет / прозрачный» нет.
Лукас Новак

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

я не знаю почему, но это не работает. линия все еще там
Сайед Хиссаан

15

Что я сделал, так это создал Shape Drawable и установил его в качестве фона:

<?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 значение false app: 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)

Обновить:

Если вы обнаружите, что всегда пропускаете ноль, вы можете кодифицировать это в методе (и тогда вы могли бы также перегружать сам 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
Этот ответ - единственный, который сработал для меня, так как мои поля редактирования текста создаются программно, и каждый из них имеет разные цвета фона, поэтому фон не может быть нулевым и полагаться на цвет фона родителей
Sharone Lev

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 становится меньше. По крайней мере, это был мой случай.

Небольшое замечание: если вы установите фоновый ноль и попробуете Java-код, который я предоставил выше, ваше приложение будет зависать сразу после его выполнения. (потому что он получает фон, но он нулевой.) Это может быть очевидно, но я думаю, что указывать это важно.


4

Я обнаружил самую любопытную вещь! Если вы установите его с nullпомощью привязки данных: android:background="@{null}"

Тогда не только фон удаляется, но у представления все еще есть отступ, который был вычислен от фона по умолчанию. Так что по какой-то причине установка отложенного нуля не очищает отступ от предыдущего bg ..? Заполнение вида: левый / верхний / правый 4dp, нижний 13dp (с уровня эмулятора 21).

Может не иметь одинакового конечного результата на всех уровнях API, так что будьте осторожны! Кто-то скажет мне, если вы проверите это и найдете это надежным. (Также обратите внимание, что нижний отступ выпирает из-за того подчеркивания, которое было в оригинале. Так что вы, вероятно, захотите изменить его в XML или сбросить его в коде после того, как он будет загружен в верхнюю часть ...



4

Если вы хотите, чтобы это влияло на все экземпляры EditText и любой класс, который наследовал от него, то вы должны установить в своей теме значение для атрибута editTextBackground.

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

Примером Drawable, который я использую, является:

<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: цвет / прозрачный"

... это не оптимальное решение, но оно работает.



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.