Android, Làm cách nào để giới hạn độ rộng của TextView (và thêm ba dấu chấm ở cuối văn bản)?


317

Tôi có một TextViewđiều mà tôi muốn giới hạn các nhân vật của nó. Trên thực tế, tôi có thể làm điều này nhưng điều mà tôi đang tìm kiếm là làm thế nào để thêm ba dấu chấm (...) vào cuối chuỗi. Điều này cho thấy các văn bản đã tiếp tục. Đây là XML của tôi nhưng không có dấu chấm mặc dù nó giới hạn văn bản của tôi.

<TextView 
        android:id                      = "@+id/tvFixture"
        android:layout_width            = "wrap_content"
        android:layout_height           = "wrap_content"
        android:layout_toLeftOf         = "@id/ivFixture_Guest"
        android:text                    = "@string/test_06"
        android:lines                   = "1"
        android:ems                     = "3"
        android:gravity                 = "right"
        style                           = "@style/simpletopic.black" 
        android:ellipsize="end"/>

Câu trả lời:


692

Không dùng nữa

Thêm một android:singleLine="true"thuộc tính nữa trong Textview của bạn

Cập nhật:

android:ellipsize="end" 
android:maxLines="1"

3
Chắc chắn cần SingleLine khi tôi chỉ thử điều này. Mặc dù nó nói không tán thành.
EGHDK

41
android: singleLine = "true" không được dùng nữa và có tác dụng phụ xấu. sử dụng android: ellipsize = "end" và maxLine = "1" thay vào đó
Hamidreza Hosseinkhani

1
"Tác dụng phụ xấu" của việc sử dụng là singleLinegì? Xem thêm: Thuộc tính xml có phải là không dùng trong Android không?
Suragch

1
btw, android: maxLines có thể lớn hơn 1 nếu bạn muốn :)
Người giữ Touré

1
Có ai có thông điệp này "W / StaticLayout: maxLineHeight không nên là -1. MaxLines: 1 lineCount: 1">?
CẮT ICE

157

Sau đây là những gì tôi học được bằng cách chơi xung quanh với các tùy chọn khác nhau để buộc một TextViewdòng thành một dòng (có và không có ba dấu chấm).

nhập mô tả hình ảnh ở đây

android: maxLines = "1"

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:maxLines="1"
    android:text="one two three four five six seven eight nine ten" />

Điều này chỉ buộc văn bản thành một dòng. Bất kỳ văn bản bổ sung được ẩn.

Liên quan:

dấu chấm lửng = "kết thúc"

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:maxLines="1"
    android:ellipsize="end"
    android:text="one two three four five six seven eight nine ten" />

Điều này cắt bỏ văn bản không phù hợp nhưng cho người dùng biết rằng văn bản đã bị cắt bớt bằng cách thêm dấu chấm lửng (ba dấu chấm).

Liên quan:

dấu chấm lửng = "marquee"

<TextView
    android:id="@+id/MarqueeText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:maxLines="1"
    android:singleLine="true"
    android:ellipsize="marquee"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:text="one two three four five six seven eight nine ten" />

Điều này làm cho cuộn văn bản tự động trên TextView. Lưu ý rằng đôi khi nó cần được đặt trong mã:

textView.setSelected(true);

Giả sử là android:maxLines="1"android:singleLine="true"nên làm về cơ bản là giống nhau và vì singleLine được rõ ràng phản đối tôi không muốn sử dụng nó, nhưng khi tôi lấy nó ra, những vùng không cuộn nữa. maxLinesMặc dù vậy, việc lấy ra không ảnh hưởng đến nó.

Liên quan:

NgangScrollView với cuộn theo chiều ngang

<HorizontalScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/horizontalScrollView">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:maxLines="1"
        android:scrollHorizontally="true"
        android:text="one two three four five six seven eight nine ten" />
</HorizontalScrollView>

Điều này cho phép người dùng cuộn thủ công để xem toàn bộ dòng văn bản.


Nhưng đây chỉ là dấu chấm lửng ở cuối mỗi từ. Có cách nào để thêm ... vào giữa một Very_long_word_without_whitespace ... không?
Tobias Reich

@TobiasReich, tôi không biết cách xây dựng để thực hiện điều đó. Bạn có thể tự tạo bằng Paint.measureText .
Suragch

Đôi khi bạn có thể cần ứng dụng: layout_constrainedWidth = "true"
Dan Crisan

80

Hãy thử thuộc tính này của TextView trong tệp bố cục của bạn ..

android:ellipsize="end"
android:maxLines="1"

31

Tôi lấy nó bạn muốn giới hạn chiều rộng đến một dòng và không giới hạn nó theo ký tự? Vì singleLinekhông được dùng nữa, bạn có thể thử sử dụng các cách sau:

android:maxLines="1"
android:scrollHorizontally="true"
android:ellipsize="end"

13

ví dụ. bạn có thể dùng

android:maxLength="13"

điều này sẽ hạn chế độ dài texview xuống còn 13 nhưng vấn đề là nếu bạn cố thêm 3 dấu chấm (...), nó sẽ không hiển thị nó, vì nó sẽ là một phần của độ dài textview.

     String userName;
     if (data.length() >= 13) {
            userName = data.substring(0, 13)+ "...";

     } else {

            userName = data;

    }
        textView.setText(userName);

ngoài việc này bạn phải sử dụng

 android:maxLines="1"

2
Bạn nên sử dụng "\ u2026" thay vì "..."
Zharro

đây chỉ là một ví dụ. nếu tôi đang đặt các chuỗi trong String.xml thì chắc chắn tôi sẽ sử dụng unicodes. Bất kỳ lý do cụ thể bạn muốn đặt ở đây?
Nayanesh Gupte

2
Không. Cá nhân tôi gần đây đã biết về sự tồn tại của nhân vật này trong Unicode và quyết định chia sẻ kiến ​​thức này;)
Zharro

6

Sử dụng

  • android:singleLine="true"
  • android:maxLines="1"
  • app:layout_constrainedWidth="true"

Đó là TextViewvẻ ngoài đầy đủ của tôi :

    <TextView
    android:id="@+id/message_title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="5dp"
    android:maxLines="1"
    android:singleLine="true"
    android:text="NAME PLACEHOLDER MORE Text"
    android:textColor="@android:color/black"
    android:textSize="16sp"

    android:textStyle="bold"
    app:layout_constrainedWidth="true"
    app:layout_constraintEnd_toStartOf="@id/message_check_sign"
    app:layout_constraintHorizontal_bias="0"
    app:layout_constraintStart_toEndOf="@id/img_chat_contact"
    app:layout_constraintTop_toTopOf="@id/img_chat_contact" />

Ảnh của <code> TextView </ code>


5

Tôi đang sử dụng Horizon Recyclerview.
1) Ở đây trong CardView, TextView bị biến dạng theo chiều dọc khi sử dụng

android:ellipsize="end"
android:maxLines="1"

Kiểm tra Nhóm Wyman TextViews đậm, Jaskolski ... nhập mô tả hình ảnh ở đây

2) Nhưng khi tôi sử dụng singleLine cùng với ellipsize -

android:ellipsize="end"
android:singleLine="true"

Kiểm tra Nhóm Wyman TextViews đậm, Jaskolski ... nhập mô tả hình ảnh ở đây

Giải pháp thứ 2 làm việc cho tôi đúng cách (sử dụng singleLine). Ngoài ra tôi đã thử nghiệm trong phiên bản HĐH: 4.1 trở lên (đến 8.0), nó hoạt động tốt mà không gặp sự cố.


4

mã:

TextView your_text_view = (TextView) findViewById(R.id.your_id_textview);
your_text_view.setEllipsize(TextUtils.TruncateAt.END);

xml:

android:maxLines = "5"

ví dụ

Trong Ma-thi-ơ 13, các môn đệ hỏi Chúa Giê-su tại sao Ngài nói với đám đông trong các dụ ngôn. Ông trả lời: "Nó đã được trao cho bạn để biết những bí ẩn của vương quốc thiên đàng, nhưng với họ nó đã không được đưa ra.

Kết quả: Trong Ma-thi-ơ 13, các môn đệ hỏi Chúa Giê-su tại sao Ngài nói với đám đông trong các dụ ngôn. Anh trả lời: "Nó đã được trao cho bạn để biết ...


4

Tôi đã nhận được kết quả mong muốn bằng cách sử dụng

android:maxLines="2"
android:minLines="2"
android:ellipsize="end"

Thủ thuật được đặt maxLines và minLines thành cùng một giá trị ... và không chỉ android: lines = "2", đừng thực hiện thủ thuật này. Ngoài ra, bạn đang tránh bất kỳ thuộc tính không dùng nữa.


4

Bạn cần thêm các dòng sau vào bố cục của bạn cho textview

android:maxLines="1"
android:ellipsize="end"
android:singleLine="true"

Hy vọng điều này làm việc cho bạn.


3

Bạn có thể giới hạn số lượng ký tự của textview và thêm (...) sau văn bản. Giả sử bạn chỉ cần hiển thị 5 chữ cái và sau đó bạn cần hiển thị (...), chỉ cần làm như sau:

String YourString = "abcdefghijk";

if(YourString.length()>5){

YourString  =  YourString.substring(0,4)+"...";

your_text_view.setText(YourString);
}else{

 your_text_view.setText(YourString); //Dont do any change

}

một chút hack ^ _ ^. Mặc dù nó không phải là một giải pháp tốt. Nhưng một công việc xung quanh làm việc cho tôi: D

EDIT: Tôi đã thêm kiểm tra cho ít ký tự theo số lượng giới hạn của bạn. của các nhân vật.



3

Để làm việc với thuộc tính android: ellipsize , bạn phải giới hạn độ rộng bố cục của TextView , sao cho văn bản nằm ngoài giới hạn từ chế độ xem của TextView.

Vì vậy, thuộc tính android: layout_creen đóng vai trò chính ở đây, đặt nó cho phù hợp.

Một ví dụ có thể là:

<TextView        
    android:layout_width="120dp"
    android:layout_height="wrap_content"
    android:ellipsize="end"
    android:text="This is a very long text to be displayed"
    android:textSize="12sp"
    android:maxLines="1"            
     />

Bây giờ, ở đây nếu văn bản trong android: text = "Đây là một văn bản rất dài sẽ được hiển thị" đi ra khỏi chế độ xem từ TextView với android: layout_creen = "120dp" , android: ellipsize = "end" sẽ cắt bớt văn bản và đặt ... (3 chấm) sau nó. tức là Điều này rất dài ... sẽ được hiển thị trong TextView.


2

Tôi nghĩ rằng bạn cung cấp sửa chữa chiều cao và chiều rộng của xem văn bản. Sau đó, giải pháp của bạn sẽ làm việc.


2

bạn có thể viết dòng này trong xml nơi bạn lấy textview:

android:singleLine="true"

2

Cách tiếp cận của @AzharShaikh hoạt động tốt.

android:ellipsize="end"
android:maxLines="1"

Nhưng tôi nhận ra một rắc rối là TextView sẽ bị cắt ngắn bởi từ (mặc định). Hiển thị nếu chúng ta có một văn bản như:

kiểm tra long_line_without_any_space_abcdefgh

TextView sẽ hiển thị:

kiểm tra...

Và tôi đã tìm ra giải pháp để xử lý sự cố này, thay thế các khoảng trắng bằng ký tự không gian không ngắt unicode, nó làm cho TextView bao bọc các ký tự thay vì các từ:

yourString.replace(" ", "\u00A0");

Kết quả:

kiểm tra long_line_without_any_space_abc ...


2
        <TextView
            android:id="@+id/product_description"
            android:layout_width="165dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="2dp"
            android:paddingLeft="12dp"
            android:paddingRight="12dp"
            android:text="Pack of 4 summer printed pajama"
            android:textColor="#d2131c"
            android:textSize="12sp"
            android:maxLines="2"
            android:ellipsize="end"/>

1

Thêm hai dòng này trong văn bản của bạn

android:ellipsize="end"
android:singleLine="true"

0

bạn có thể làm điều đó bằng cách xml:

<TextView 
    android:id="@+id/textview"
    android:maxLines="1" // or any number of lines you want
    android:ellipsize="end"
    />

Làm thế nào tôi có thể đặt 3 Dots@ end với maxLength="35"bất kỳ giải pháp nào?
Sagar

-1

Bạn chỉ cần thay đổi ...

android:layout_width="wrap_content"

Sử dụng dòng dưới đây

android:layout_width="match_parent"

.......

   <LinearLayout
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_centerVertical="true"
       android:layout_marginLeft="10dp"
       android:layout_marginTop="10dp"
       android:layout_toRightOf="@+id/visitBox"
       android:orientation="vertical" >

             <TextView
                  android:id="@+id/txvrequestTitle"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:singleLine="true"
                  android:text="Abcdefghighiklmnon"
                  android:textAppearance="? 
                  android:attr/textAppearanceLarge"
                  android:textColor="@color/orange_color" />

   </LinearLayout>

SingleLine không được dùng nữa
Nick
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.