Android, วิธีจำกัดความกว้างของ TextView (และเพิ่มจุดสามจุดที่ท้ายข้อความ)?


317

ฉันมีสิ่งTextViewที่ฉันต้องการที่จะ จำกัด ตัวละครของมัน ที่จริงแล้วฉันสามารถทำได้ แต่สิ่งที่ฉันกำลังมองหาคือวิธีการเพิ่มสามจุด (... ) ในตอนท้ายของสตริง อันนี้แสดงข้อความที่มีต่อ นี่คือ XML ของฉัน แต่ไม่มีจุดแม้ว่าจะ จำกัด ข้อความของฉัน

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

คำตอบ:


692

เลิกใช้:

เพิ่มอีกหนึ่งคุณสมบัติandroid:singleLine="true"ใน Textview ของคุณ

Updated:

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

3
ต้องการซิงเกิ้ลไลน์แน่นอนเมื่อฉันลองทำดู แม้ว่ามันจะบอกว่าเลิก
EGHDK

41
android: singleLine = "true" เลิกใช้แล้วและมีผลข้างเคียงที่ไม่ดี ใช้ android: ellipsize = "end" และ maxLine = "1" แทน
Hamidreza Hosseinkhani

1
"ผลข้างเคียงที่ไม่ดี" ของการใช้singleLineคืออะไร? ดูเพิ่มเติม: แอตทริบิวต์ xml singleLine เลิกใช้แล้วหรือไม่ใน Android?
Suragch

1
btw, android: maxLines สามารถมากกว่า 1 ถ้าคุณต้องการ :)
Touré Holder

1
มีใครได้รับข้อความนี้ "W / StaticLayout: maxLineHeight ไม่ควรเป็น -1 maxLines: 1 lineCount: 1">?
เย็นน้ำแข็ง

157

ต่อไปนี้คือสิ่งที่ฉันเรียนรู้โดยการเล่นกับตัวเลือกต่าง ๆ เพื่อบังคับTextViewให้เป็นหนึ่งบรรทัด (โดยมีและไม่มีจุดสามจุด)

ป้อนคำอธิบายรูปภาพที่นี่

หุ่นยนต์: 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" />

นี่เป็นเพียงการบังคับให้ข้อความถึงหนึ่งบรรทัด ซ่อนข้อความพิเศษใด ๆ

ที่เกี่ยวข้อง:

ellipsize = "จบ"

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

วิธีนี้จะตัดข้อความที่ไม่พอดี แต่ให้ผู้ใช้ทราบว่าข้อความถูกตัดทอนโดยการเพิ่มจุดไข่ปลา (จุดสามจุด)

ที่เกี่ยวข้อง:

ellipsize = "กระโจม"

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

สิ่งนี้ทำให้การเลื่อนข้อความข้าม TextView โดยอัตโนมัติ โปรดทราบว่าบางครั้งจำเป็นต้องตั้งรหัส

textView.setSelected(true);

คาดคะเนandroid:maxLines="1"และandroid:singleLine="true"ควรจะทำสิ่งเดียวกันโดยทั่วไปและเนื่องจาก singleLine เห็นได้ชัดว่าเลิกฉันไม่ต้องการใช้มัน แต่เมื่อฉันเอามันออกกระโจมไม่เลื่อนอีกต่อไป maxLinesแม้ว่าการออกไปจะไม่มีผลกับมัน

ที่เกี่ยวข้อง:

HorizontalScrollView พร้อมการเลื่อนในแนวนอน

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

สิ่งนี้ทำให้ผู้ใช้สามารถเลื่อนดูข้อความทั้งหมดได้ด้วยตนเอง


แต่นี่เป็นเพียงจุดไข่ปลาในตอนท้ายของทุกคำ มีวิธีการเพิ่ม ... ในช่วงกลางของ very_long_word_without_whitespace ... หรือไม่
Tobias Reich

@TobiasReich ฉันไม่ได้ตระหนักถึงวิธีที่จะทำให้สำเร็จ คุณสามารถทำให้ตัวเองของคุณโดยใช้Paint.measureText
Suragch

บางครั้งคุณอาจต้องใช้แอพ: layout_constrainedWidth = "true" ด้วย
Dan Crisan

80

ลองใช้คุณสมบัติของ TextView ในไฟล์เลย์เอาต์ของคุณ ..

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

31

ฉันคิดว่าคุณต้องการจำกัดความกว้างของหนึ่งบรรทัดและไม่ จำกัด ตามตัวอักษร? เนื่องจากsingleLineเลิกใช้แล้วคุณสามารถลองใช้สิ่งต่อไปนี้ร่วมกัน:

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

13

เช่น. คุณสามารถใช้ได้

android:maxLength="13"

สิ่งนี้จะจำกัดความยาวของ texview ไว้ที่ 13 แต่ปัญหาคือถ้าคุณพยายามเพิ่ม 3 จุด (... ) มันจะไม่แสดงมันเนื่องจากมันจะเป็นส่วนหนึ่งของความยาวของข้อความ

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

     } else {

            userName = data;

    }
        textView.setText(userName);

นอกเหนือจากนี้คุณต้องใช้

 android:maxLines="1"

2
คุณควรใช้ "\ u2026" แทน "... "
Zharro

นี่เป็นเพียงตัวอย่าง ถ้าฉันใส่สตริงใน Strings.xml ถ้าอย่างนั้นฉันจะไปหายูนิโค้ด มีเหตุผลใดที่คุณต้องการใส่ที่นี่?
Nayanesh Gupte

2
Nope ผมเองได้เรียนรู้เมื่อเร็ว ๆ นี้การดำรงอยู่ของตัวละครตัวนี้ใน Unicode และตัดสินใจที่จะแบ่งปันความรู้นี้;)
Zharro

6

ใช้

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

มันเป็นTextViewลักษณะที่เต็มของฉัน:

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

รูปภาพของ <code> TextView </code>


5

ฉันใช้ Horizonal Recyclerview
1) ที่นี่ใน CardView, TextView ได้รับการบิดเบือนในแนวตั้งเมื่อใช้

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

ตรวจสอบกลุ่มตัวอักษร TextViews Wyman, Jaskolski ... ป้อนคำอธิบายรูปภาพที่นี่

2) แต่เมื่อฉันใช้ singleLine พร้อมกับ ellipsize -

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

ตรวจสอบกลุ่มตัวอักษร TextViews Wyman, Jaskolski ... ป้อนคำอธิบายรูปภาพที่นี่

วิธีที่สองทำงานได้อย่างถูกต้องสำหรับฉัน (ใช้ singleLine) นอกจากนี้ฉันได้ทำการทดสอบในเวอร์ชั่น OS: 4.1 ขึ้นไป (จนถึง 8.0) มันใช้งานได้ดีโดยไม่มีข้อขัดข้อง


4

รหัส:

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

XML:

android:maxLines = "5"

เช่น

ในแมทธิว 13 สาวกถามพระเยซูว่าทำไมพระองค์จึงตรัสกับฝูงชนเป็นคำอุปมา เขาตอบว่า "มีให้คุณแล้วที่จะรู้ถึงความลึกลับของอาณาจักรแห่งสวรรค์ แต่สำหรับพวกเขานั้นยังไม่ได้รับ

ผลลัพธ์: ในแมทธิว 13 พวกสาวกถามพระเยซูว่าเหตุใดพระองค์จึงตรัสกับฝูงชนเป็นคำอุปมา เขาตอบว่า "คุณได้รับรู้แล้ว ...


4

ฉันได้รับผลลัพธ์ที่ต้องการโดยใช้

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

เคล็ดลับถูกตั้งค่า maxLines และ minLines เป็นค่าเดียวกัน ... และไม่ใช่เฉพาะ android: lines = "2", dosen't do the trick นอกจากนี้คุณกำลังหลีกเลี่ยงแอตทริบิวต์ที่เลิกใช้แล้ว


4

คุณต้องเพิ่มบรรทัดต่อไปนี้ในเลย์เอาต์ของคุณสำหรับมุมมองข้อความ

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

หวังว่านี่จะเป็นประโยชน์สำหรับคุณ


3

คุณสามารถ จำกัด จำนวนตัวอักษรของข้อความและเพิ่ม (... ) หลังข้อความได้ สมมติว่าคุณต้องแสดง 5 ตัวอักษรเท่านั้นและหลังจากนั้นคุณจะต้องแสดง (... ) เพียงทำดังนี้:

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

}

แฮ็คเล็กน้อย ^ _ ^ แม้ว่ามันจะไม่ใช่ทางออกที่ดี แต่มีวิธีแก้ไขสำหรับฉัน: D

แก้ไข: ฉันได้เพิ่มการตรวจสอบตัวละครน้อยลงตามจำนวนที่ จำกัด ของคุณ ของตัวละคร



3

ในการทำงานกับคุณลักษณะandroid: ellipsizeคุณต้อง จำกัดความกว้างของเลย์เอาต์ของTextViewเช่นว่าข้อความนั้นอยู่นอกขอบเขตจากมุมมองของ TextView

ดังนั้นandroid:คุณลักษณะlayout_widthมีบทบาทสำคัญที่นี่ตั้งตาม

ตัวอย่างหนึ่งสามารถ:

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

ตอนนี้ที่นี่ถ้าข้อความในandroid: text = "นี่คือข้อความที่ยาวมากที่จะแสดง"ออกไปจากมุมมองจาก TextView กับandroid: layout_width = "120dp" , android: ellipsize = "end"จะตัดทอนข้อความและ วาง... (3 จุด)หลังจากนั้น ie นี่คือความยาวมาก ...จะปรากฏใน TextView


2

ฉันคิดว่าคุณให้ความสูงและความกว้างของมุมมองข้อความแก้ไข จากนั้นโซลูชันของคุณจะทำงาน



2

วิธีการของ @AzharShaikh ทำงานได้ดี

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

แต่ฉันพบปัญหาที่ TextView จะถูกตัดทอนด้วยคำ (ตามค่าเริ่มต้น) แสดงถ้าเรามีข้อความเช่น:

ทดสอบ long_line_without_any_space_abcdefgh

TextView จะแสดง:

ทดสอบ...

และฉันได้พบวิธีแก้ปัญหาเพื่อจัดการกับปัญหานี้แทนที่ช่องว่างด้วยอักขระช่องว่างแบบ unicode ซึ่งทำให้ TextView ตัดกับอักขระแทนคำ:

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

ผลลัพธ์:

ทดสอบ 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"/>


0

คุณสามารถทำได้โดยxml:

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

ฉันจะใส่ 3 Dots@ end พร้อมmaxLength="35"คุณสมบัติแก้ไขปัญหาได้อย่างไร?
ซาก้า

-1

คุณแค่เปลี่ยน ...

android:layout_width="wrap_content"

ใช้บรรทัดด้านล่างนี้

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>

เลิกใช้งานครั้ง
Nick
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.