Как скрыть подчеркивание в EditText

496

Как я могу скрыть строку с надписью EditText (строка подсказки с маленькими засечками на концах)?

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

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

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

Пери Хартман
источник
Возможный дубликат? stackoverflow.com/questions/5478109/…
Мохамед Тахер Alrefaie

Ответы:

1052

Вы можете установить, EditTextчтобы иметь настраиваемый прозрачный рисунок или просто использовать

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

или

android:background="@null"

или программно

editText.setBackgroundResource(android.R.color.transparent);
ha1ogen
источник
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

AjayCodes
источник
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()
разработчик Android
источник
Этот ответ идеален и должен быть принят. Он может удалить фон, не удаляя отступы по умолчанию.
Панкадж Кумар
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"

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

Harvinder Singh
источник
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-код, который я предоставил выше, ваше приложение будет зависать сразу после его выполнения. (потому что он получает фон, но он нулевой.) Это может быть очевидно, но я думаю, что указывать это важно.

bengongon97
источник
4

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

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

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

androidguy
источник
4

если ваш текст для редактирования уже имеет фон, то вы можете использовать следующее.

android:textCursorDrawable="@null"
АКАШ ВАНГАЛВАР
источник
Хотя это не решает вопрос, это помогло мне.
Рубен Вигера,
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 удалить подчеркивание во всем приложении, и вам не нужно будет применять стиль к каждому из них вручную.

kingargyle
источник
4

Просто используйте это

 editText.setBackgroundColor(Color.TRANSPARENT);
Прашант Куте
источник
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

Программно использовать: editText.setBackground(null)

Из xmlиспользования:android:background="@null"

Шубхам Каушик
источник
1
android:background="@android:color/transparent"

Или

android:background="@null"
исключение нулевого указателя
источник
1

android: inputType = "textVisiblePassword | textMultiLine" android: background = "@ android: цвет / прозрачный"

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

Карлес Гарригес
источник
0

Установить фон на ноль

android:background="@null" in your xml 
Джослин
источник
0

В моем случае editText.setBackgroundResource(R.color.transparent);лучше.

Он не удаляет отступы по умолчанию, просто под строкой.

R.color.transparent = #00000000

HJ Song
источник
0

если вы используете фон, то вы должны использовать этот тег

android:testCursorDrawable="@null" 
ATIQ UR REHMAN
источник
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" />
itabdullah
источник