Cách ẩn thanh dưới trong EditText


496

Làm cách nào tôi có thể ẩn thanh bên dưới Chỉnh sửa (dòng nhắc với ít serif ở cuối)?

Có thể có một cách tốt hơn để làm những gì tôi muốn: Tôi có bố cục với EditText. Thông thường, điều này sẽ hiển thị tốt nơi người dùng có thể chạm vào nó và bắt đầu nhập hoặc chỉnh sửa văn bản.

Tuy nhiên, đôi khi, tôi muốn sử dụng cùng một bố cục (đơn giản hóa logic khác) để hiển thị cùng một dữ liệu theo cách chỉ đọc. Tôi muốn bản trình bày tương tự nhau - nó phải có cùng chiều cao và cùng một phông chữ, nhưng không có thanh dưới.

Là một biện pháp ngăn chặn, tôi sẽ thực hiện điều này bằng cách xóa EditText và thay thế TextView. Tôi nghĩ rằng điều đó sẽ mang lại kết quả mong muốn, nhưng có vẻ như một đường vòng là một cách tốn kém để làm một việc gì đó phải dễ thực hiện bằng cách thay đổi các thuộc tính.


Câu trả lời:


1052

Bạn có thể đặt EditTextđể có thể vẽ trong suốt tùy chỉnh hoặc chỉ sử dụng

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

hoặc là

android:background="@null"

hoặc lập trình

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

7
Câu trả lời tốt nhất, như ha1ogen nói, là tạo ra một bản vẽ tùy chỉnh. Bắt đầu với bản vá 9 được sử dụng cho các trường EditText bình thường. Sửa đổi nó để loại bỏ thanh bên dưới và đồ họa khác mà bạn không muốn. Với điều này, EditText được sửa đổi của bạn sẽ có cùng lề và hình thức tổng thể như các trường EditText bình thường. Nếu bạn chỉ đơn giản đặt nền thành null, nó sẽ mất lề.
Peri Hartman

124
sử dụng cái này:android:background="@android:color/transparent"
dd619

3
Điều gì xảy ra nếu tôi đã có nền của màu khác, giả sử màu xám, làm thế nào để loại bỏ gạch dưới / gạch chân trong trường hợp đó?
Narendra Singh

6
Trong Android 19, việc sử dụng android:background="@android:color/transparent"gây ra vấn đề mất lợi nhuận tương tự ... Có ví dụ nào về việc ai đó tạo ra một bản vẽ tùy chỉnh như vậy không?
Chống Trái đất

2
Làm thế nào chúng ta có thể làm lập trình trong java?
jagdish

100

Đặt nền thành null.

android:background="@null"

2
Điều đó giống như nền = "# 00000000". Không thực sự làm việc.
Peri Hartman

14
Điều này làm việc cho tôi nhưng cuối cùng tôi đã làm android:background="@android:color/transparent@nullđáng sợ.
Dick Lucas

3
@Richard tại sao @nullđáng sợ?
Michael

@null sẽ chỉ ra không có nền tồn tại. Nếu chúng tôi chỉ định nền = "# 00000000", nó sẽ vẽ nền trắng với giá trị alpha "0".
Vinayak V Naik

2
"@null" cũng ẩn con trỏ nhấp nháy, "@android: màu / trong suốt" không.
Lukas Novak

37

Bạn có thể đặt EditText's backgroundTintgiá trị cho một màu sắc cụ thể. Nếu bạn đặt màu trong suốt, thanh dưới sẽ biến mất.

android:backgroundTint="@color/Transparent"

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

Nhưng bạn có thể sử dụng cái này trong Api v21(Lollipop)hoặc cao hơn


Đây là cách tốt hơn so với thay đổi nền của toàn bộ chế độ xem (như các câu trả lời khác gợi ý)
Alex Semeniuk

26

Vui lòng đặt nền edittext của bạn là

android:background="#00000000"

Nó sẽ làm việc.


3
Nó sẽ sắp xếp công việc, nhưng không đúng cách. Nếu bạn chỉ đơn giản xóa nền, bạn cũng sẽ mất các lề xung quanh trường - chúng là một phần của nền mặc định. Giải pháp phù hợp là thay thế một nền tảng khác mà đơn giản là không có thanh lót trong đó, như @ ha1ogen gợi ý
Peri Hartman

1
Cách hoàn tác chương trình này
Tushar Narang

23

Bạn có thể làm điều đó bằng lập trình bằng cách sử dụng setBackgroundResource:

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

tôi không biết tại sao, nhưng nó không hoạt động. dòng vẫn còn đó
Syed Hissaan

15

Những gì tôi đã làm là tạo ra một hình dạng có thể vẽ được và đặt nó làm nền:

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

Lưu ý: Tôi thực sự đã sử dụng @dimen@colorcác giá trị cho các lính cứu hỏa, nhưng tôi đã đơn giản hóa tệp hình dạng ở đây cho rõ ràng.


1
Đây là một lựa chọn hoàn toàn tốt, quá. Đó là một biến thể của việc thiết lập một drawable tùy chỉnh.
Peri Hartman

15

Sử dụng một trong hai tài sản:

android:background="@null"

HOẶC LÀ

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

làm việc cho tôi để ẩn phần gạch chân của EditText.

Tuy nhiên, xin lưu ý rằng sau đó nó gây ra vấn đề về khoảng cách với TextInputLayout mà tôi đã bao quanh EditText


1
Vấn đề khoảng cách đến từ bố trí lỗi. Để sửa lỗi đó, đặt thuộc tính errorEnables của TextInputLayout thành false app: errorEnables = "false"
Ulbo

12

Đây là một cách để ẩn nó, mà không làm hỏng phần đệm mặc định:

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

sử dụng:

editText.setViewBackgroundWithoutResettingPadding(null)

Cập nhật:

Nếu bạn thấy mình luôn vượt qua null, bạn có thể mã hóa điều đó trong phương thức (và sau đó bạn cũng có thể tự quá tải 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()

Câu trả lời này là hoàn hảo và nên được chấp nhận. Nó có thể loại bỏ nền mà không cần loại bỏ đệm mặc định.
Pankaj Kumar

6

Bạn cũng phải đặt minWidth, nếu không con trỏ sẽ biến mất nếu văn bản trống.

        <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

Trong trường hợp của tôi, tôi đã sử dụng nền tùy chỉnh để chỉnh sửa văn bản, vì vậy, đặt nền thành @null hoặc đặt tint thành trong suốt không phải là giải pháp cho tôi vì vậy tôi đã chơi một mẹo nhỏ rất hữu ích cho tôi.

android:inputType="textVisiblePassword"

và nó hoàn thành công việc khá tốt .. nó không phải là giải pháp tối ưu nhưng nó hoạt động


1
Tôi thích điều này kết hợp với nền trong suốt vì nó ẩn thanh hiển thị bên dưới văn bản trong khi gõ - tất cả những gì tôi muốn là văn bản, không có trang sức.
19Craig

1
Câu trả lời này là câu duy nhất phù hợp với tôi vì các hộp edittext của tôi được tạo theo chương trình và mỗi màu có các màu nền khác nhau để nền không thể rỗng và dựa vào màu nền của cha mẹ
Sharone Lev

5

Tôi có một cái gì đó như thế này rất hữu ích:

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

trong đó generalEditText là EditText của tôi và màu trắng là:

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

Điều này sẽ không loại bỏ phần đệm và EditText của bạn sẽ vẫn như cũ. Chỉ dòng ở dưới cùng sẽ được gỡ bỏ. Đôi khi nó hữu ích hơn để làm điều đó như thế này.

Nếu bạn sử dụng android:background="@null"nhiều đề xuất, bạn sẽ mất phần đệm và EditText trở nên nhỏ hơn. Ít nhất, đó là trường hợp của tôi.

Một lưu ý nhỏ là nếu bạn đặt nền null và thử mã java tôi đã cung cấp ở trên, ứng dụng của bạn sẽ bị sập ngay sau khi thực thi. (bởi vì nó có nền nhưng nó là null.) Nó có thể rõ ràng nhưng tôi nghĩ việc chỉ ra nó là quan trọng.


4

Tôi phát hiện ra điều tò mò nhất! Nếu bạn đặt nó thành nullsử dụng Data Binding: android:background="@{null}"

Sau đó, không chỉ nền bị xóa mà chế độ xem vẫn có phần đệm được tính từ nền mặc định. Vì vậy, vì một số lý do, cài đặt null bị trì hoãn không xóa phần đệm từ bg trước đó ..? Phần đệm trên khung nhìn là 4dp trái / trên / phải, dưới 13dp (từ trình giả lập cấp 21).

Có thể không có kết quả cuối cùng trên tất cả các cấp API, vì vậy hãy cẩn thận! Ai đó nói với tôi nếu bạn kiểm tra điều này và thấy nó đáng tin cậy. (Cũng lưu ý rằng phần đệm phía dưới nhô ra vì phần gạch chân đó có trong bản gốc. Vì vậy, có lẽ bạn sẽ muốn thay đổi nó trong XML hoặc đặt lại nó trong mã sau khi được tải lên trên cùng ...


4

nếu văn bản chỉnh sửa của bạn đã có nền thì bạn có thể sử dụng như sau.

android:textCursorDrawable="@null"

Mặc dù điều này không giải quyết được câu hỏi nhưng nó giúp ích cho tôi.
Rubén Viguera

4

Nếu bạn muốn điều này ảnh hưởng đến tất cả các phiên bản của EditText và bất kỳ lớp nào kế thừa từ nó, thì bạn nên đặt trong chủ đề của mình giá trị cho thuộc tính, editTextBackground.

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

Một ví dụ về drawable tôi sử dụng là:

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

Đây là phiên bản sửa đổi một chút của những gì thực hiện thiết kế vật liệu mặc định.

Khi được áp dụng, nó sẽ làm cho tất cả EditText của bạn xóa phần gạch chân trong toàn bộ ứng dụng và bạn không phải áp dụng kiểu cho từng cái một cách thủ công.


4

Đơn giản chỉ cần sử dụng cái này

 editText.setBackgroundColor(Color.TRANSPARENT);

2

Bạn cũng có thể xác định PHONG CÁCH cho chỉnh sửa của mình để bạn có thể tập hợp lại tất cả các thuộc tính chung. Nó rất mạnh nếu bạn phải chỉnh sửa nhiều văn bản cần có hành vi

Đặt mã vào res / value / 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>

Sau đó, bạn chỉ cần gọi nó trong editText của bạn

<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

Lập trình sử dụng: editText.setBackground(null)

Từ xmlsử dụng:android:background="@null"



1

android: inputType = "textVisiblePassword | textMultiLine" android: background = "@ android: color / minh bạch"

... nó không phải là giải pháp tối ưu nhưng nó hoạt động.


0

Đặt nền thành null

android:background="@null" in your xml 

0

Trong trường hợp của tôi, editText.setBackgroundResource(R.color.transparent); là tốt nhất.

Nó không loại bỏ phần đệm mặc định, ngay dưới thanh.

R.color.transparent = #00000000


0

nếu bạn đang sử dụng nền thì bạn phải sử dụng thẻ này

android:testCursorDrawable="@null" 

0

Để giữ lại cả lề và màu nền, hãy sử dụng:

nền

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

Chỉnh sửa văn bản:

<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" />
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.